我正在尝试使用PHP的pthread
扩展名来设置线程化TCP服务器。我知道,它没有正式支持,但我试图做这样的事情:
class luokka extends Thread {
private $client;
public function __construct($socket) {
$this->client = $socket;
$this->start(); // Starts the threading
}
public function run() {
while (true) {
$data = socket_read($this->client, 128);
if ($data === false) {
// Error, or client disconnection = break
}
// ...
}
}
}
$clients = array();
while (1) {
if (($sox = socket_accept($server)) !== false) {
$clients[] = new luokka($sox);
}
}
但是,读取客户端发送的数据在成功后返回false,并且在此之后仍在运行。只有服务器设置为非阻塞模式,以便在主无限循环中允许其他内容。当我从服务器关闭客户端连接时,客户端没有检测到它(关于错误结果?)。当客户端关闭连接时,服务器在读取时不会将其检测为false。怎么办?
然后,当它结束时,如何从$clients
数组中删除客户端特定的类?转储这个变量给了我" NULL"在课堂上。
答案 0 :(得分:0)
你需要在线程上用条件关闭while。
$this->running = true;
while $this->running) {
$data = socket_read($this->client, 128);
if ($data === false) {
$this->running = false;
}
}
将$ clients上的运行var更改为false以完成该主题,对不起我的英语haahha。