PHP线程TCP套接字服务器

时间:2015-07-16 16:01:19

标签: php multithreading sockets tcp client

我正在尝试使用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"在课堂上。

1 个答案:

答案 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。