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

时间:2015-06-24 12:17:31

标签: php sockets tcp freeze hang

我试图建立一个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();而无需在包含侦听器的数组中拥有我的客户端副本?为客户提供干净的阵列。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

只需将侦听套接字$socket设置为非阻塞模式即可。客户端连接并正在读取数据,但客户端断开连接不是实时处理的(它有相当大的延迟)。这有什么理由吗?