我试图建立一个TCP套接字服务器,它应该同时支持许多客户端连接以及接收和发送数据。PHP 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();
没有一个数组,其中包括听众为我的客户的副本?为客户提供一个干净的阵列。
您是否设置了文件描述符[non-blocking](http://php.net/manual/en/function.socket-set-nonblock.php)? –
你是否在PHP过程中尝试过strace? – ODaniel
将服务器添加到非阻塞模式导致上次发生错误。现在它执行代码,但客户端没有断开连接。我应该为客户设置非阻塞模式吗? –