socket_select永远不会超时

时间:2015-02-11 01:32:25

标签: php sockets

我一直在努力创建一个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是一个循环,所以我可以将数据发送到连接的套接字。

1 个答案:

答案 0 :(得分:1)

每次循环播放都会调用socket_accept()。如果没有新连接到达,此呼叫将被阻止。

$socket添加到您传递给socket_select()的套接字数组中,如果该套接字显示为可读,则仅调用socket_accept()。 (您还需要在其他循环中使该套接字成为异常,这样您就不会尝试写入它。)