php使用多线程管理socket

最近看了PHP的pthreads扩展,用它写了个管理socket的demo,
server.php

class T extends Thread
{
    private $conn;

    public function __construct($conn)
    {
        $this->conn = $conn;
        echo "creating T\n";
    }

    public function run()
    {
        $str = socket_read($this->conn, 1024);
        echo $str, PHP_EOL;
        socket_write($this->conn, "hello, world\n", 13);
        while (true) {
            socket_write($this->conn, "hello, world\n", 13);
        }
    }
}

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 8080);
socket_listen($socket);

while (true) {
    $conn = socket_accept($socket);
    $t = new T($conn);
    echo "create T\n";
    var_dump($t->start());
}

client.php

$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client, '127.0.0.1', 8080);
socket_write($client, 'client connected');
echo socket_read($client, 1024);
while (true) {
    $str = socket_read($client, 1024);
    if ($str) {
        echo $str;
    } else {
        break;
    }
}

但是运行后发现只有第一个client可以正常连接并发送消息,第二个client会卡死,第一个client连接时,server输出如下

creating T
create T
client connected
bool(true)

第二个client连接时,服务器就只会输出creating T,然后就没有下文了。使用netstat查看连接
图片描述

使用ps查看线程
图片描述

想了很久都没找到原因,求大神指点

阅读 2.8k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题