我一直在努力创建一个PHP套接字服务器,这是我之前从未做过的事情。所以我可能不知道所有socket_ *函数是如何工作的。
我遇到的麻烦是socket_select中的超时功能。
while(true){
//Copy $clients so the list doesn't get modified by socket_select();
$read = $clients;
$write = $clients;
//new socket tries to connect
if(!$new = socket_accept($socket)){
echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error()); break;
}
//Accept the new client
if(!in_array($new, $clients)){
$clients[] = $new;
sendMessage($new, "Hello and welcome to the PHP server!");
}
//Wait for read
socket_select($read, $write, $empty, 5, 5);
foreach($read as $client){
$id = array_search($client,$clients);
echo $id." ".readMessage($client);
}
//Write data to the connected sockets
foreach($write as $client){
sendMessage($client, rand(0,99999));
}
echo "I'm bored\n";
}
根据我对socket_select的理解,这个脚本应该说,"我很无聊"每5秒钟。但它没有,为什么?
为什么我要超时socket_select是一个循环,所以我可以将数据发送到连接的套接字。
答案 0 :(得分:1)
每次循环播放都会调用socket_accept()
。如果没有新连接到达,此呼叫将被阻止。
将$socket
添加到您传递给socket_select()
的套接字数组中,如果该套接字显示为可读,则仅调用socket_accept()
。 (您还需要在其他循环中使该套接字成为异常,这样您就不会尝试写入它。)