线程对象更改套接字资源 ID


Threaded object changing socket resource id

我正在编写一个脚本,它将在后台接受多个套接字连接并完成齿轮工收到的一些工作(在这种情况下忘记齿轮工)

class ListenerThread extends Thread
{
    public function run(){
        $host = '192.168.30.119';
        $port = 5010;
        $socket = socket_create(AF_INET, SOCK_STREAM, 0);
        socket_bind($socket, $host, $port);
        socket_listen($socket);
        $client = array($socket);
        global $clientsArr;
        do{
             socket_select($client, $write = NULL, $except = NULL, $tv_sec = NULL);
             if(in_array($socket, $client)){
                 $tmp = socket_accept($socket);
                 socket_write($tmp, "who are you'n");
                 $request = trim(socket_read($tmp, 2024));
                 echo "new client connected'n";
                 $clientsArr[] = $tmp;
                 $client[] = $tmp;
             }
        } while(true);
    }
}
global $clientsArr;
$clientsArr = new Threaded();
$listener = new ListenerThread();
$listener->start(PTHREADS_INHERIT_ALL | PTHREADS_ALLOW_GLOBALS);

for($i = 0; $i < 100; $i++){
    print_r($clientsArr);
    sleep(2);
}

现在当我运行此代码并将客户端与telnet 192.168.30.119 5010连接时,我得到奇怪的输出

输出

new client connected
Threaded Object
(
   [0] => Resource id #4
)
Threaded Object
(
   [0] => Resource id #5
)
Threaded Object
(
   [0] => Resource id #6
)

为什么线程或其他东西会更改资源,即使只有一个连接?

请注意,这是我第一次使用线程,所以如果有人有更好的解决方案,请分享。

目标是有一个后台循环,它将侦听端口并将连接存储在数组或对象中,这些连接应该可以在类外访问。

请注意,

我不是线程专家,但我会尽力提供帮助。

首先,从这里开始:套接字资源 ID 溢出

A) 什么可能导致资源 ID 出现异常增量?

"PHP 不会在内部重用资源 ID。"

(这里有一个类似的问题和答案:https://bytes.com/topic/php/answers/729100-about-resource-ids)

其次,阅读博利特评论 http://php.net/manual/en/function.socket-accept.php:

如果你想在服务器上有多个客户端,你必须使用非阻塞。

...
socket_listen($socket);
socket_set_nonblock($socket); // <---
while(true)
{
    if(($newc = socket_accept($socket)) !== false)

在 php.net 中也有一些类似的工作示例(如果您想检查它)。

希望它能为您的问题带来一些"光明"。