【问题标题】:socket_select never time outsocket_select 永远不会超时
【发布时间】:2015-02-11 01:32:25
【问题描述】:

我一直在尝试制作一个 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 超时是为了做一个循环,这样我就可以将数据发送到连接的套接字。

【问题讨论】:

    标签: php sockets


    【解决方案1】:

    您每次在循环中都调用socket_accept()。如果没有新连接到达,此调用将阻塞。

    $socket 添加到您传递给socket_select() 的套接字数组中,并且仅当该套接字显示为可读时才调用socket_accept()。 (您还需要在其他循环中将该套接字设为异常,这样您就不会尝试对其进行写入。)

    【讨论】:

    • 非常感谢,一直以来我都以为socket_select没用。
    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2011-05-25
    • 2013-10-16
    • 2019-03-14
    • 2011-05-18
    相关资源
    最近更新 更多