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

标签 php multithreading sockets

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

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
)

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

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

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

最佳答案

请注意,我不是线程专家,但我会尽力提供帮助..

首先,来自这里:Socket resource id overflowing

A) What could cause unusual increments in the resource id?

"PHP does not re-use resource IDs internally .."

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

二、读书http://php.net/manual/en/function.socket-accept.php Boylett 评论:

If you want to have multiple clients on a server you will have to use non blocking.

...
socket_listen($socket);
socket_set_nonblock($socket); // <---

while(true)
{
    if(($newc = socket_accept($socket)) !== false)

在 php.net 中也有一些类似的工作示例(如果你想查看的话)。

希望它能为您的问题带来一些“启发”。

关于php - 线程对象更改套接字资源 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36086848/

相关文章:

java - Java 中的线程作业

c - 如何使用套接字编程一次发送三个字符

C/确定接收数据包的端口

c# - 在多线程环境中使用 .Net UdpClient

python - 如何检测Python线程是否被杀死?

php - 从 Controller 到 View

php - mysql_affected_rows() 解决方法?

java - 为什么这个套接字程序每次连接时都会占用不同的端口

php - 内存泄漏或连接未关闭

php - 确保所有标签都关闭 php