Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP TCP套接字服务器在接受新连接时挂起_Php_Sockets_Tcp_Freeze - Fatal编程技术网

PHP TCP套接字服务器在接受新连接时挂起

PHP TCP套接字服务器在接受新连接时挂起,php,sockets,tcp,freeze,Php,Sockets,Tcp,Freeze,我正在尝试设置一个TCP套接字服务器,它应该同时支持多个客户端连接以及数据的接收和发送 为此,我尝试使用PHP的socket_select()

我正在尝试设置一个TCP套接字服务器,它应该同时支持多个客户端连接以及数据的接收和发送

为此,我尝试使用PHP的
socket_select()socket_read()进程,它应该在哪里继续,无论是否有数据。我尝试运行下面的代码,但它总是挂在新的客户端连接上

// TCP socket created
$clients = array($socket);
while (true) { // Infinite loop for server
   $newsock = socket_accept($socket);
   if ($newsock !== false) {
      // Adds a new client
      $clients[] = $newsock;
   }
   $read = $clients;
   $write = NULL;
   $except = NULL;
   $num_changed_sockets = socket_select($read, $write, $except, 0);
   if ($num_changed_sockets === false) {
      // Error here
   } else if ($num_changed_sockets > 0) {
      // Something happened
      if (in_array($socket, $read)) {
         $key = array_search($socket, $read);
         unset($read($key]);
      }
      foreach ($read as $read_socket) {
         $data = socket_read($read_socket, 128); // This should not hang!
         if ($data === false) {
            // Disconnect client
         }
         // Reads data, sends answer...
      }
   }
   // Something to send for all clients
}

是否也可以使用
socket_select()
在包含侦听器的数组中没有客户端副本吗?只有一个干净的客户端阵列。

默认情况下,套接字是阻塞的,您应该将被动侦听套接字(
$socket
在您的情况下)放入传递给
套接字的读取集中,当您可以接受新连接时,它将是可读的。

只需将侦听套接字
$socket
设置为非阻塞模式。客户端连接起来,数据被读取,但是客户端断开连接没有得到实时处理(有相当大的延迟)。有什么原因吗?

您是否设置了文件描述符?您是否尝试过对php进程进行扫描?上次将服务器添加到非阻塞模式导致我出错。现在它执行代码,但客户端没有断开连接。我是否也应该为客户端设置非阻塞模式?
$socket
必须包含在
$read
中,以使
socket\u send
工作。否则,将抛出有关套接字资源的错误。