Set a timeout on socket_read
我想知道如何在socket_read呼叫上设置超时?第一次调用socket_read时,它将等待直到发送数据为止,如果5秒钟内没有发送数据,我想关闭连接。有帮助吗?我已经尝试了SO_RCVTIMEO并没有运气。
我正在用socket_create()创建一个套接字,并在其上侦听连接,然后在连接时侦听数据,然后对其进行处理。当超时达到时,我要先运行socket_shutdown(),然后运行socket_close()。
- 请注意,Windows Sockets API在小于500毫秒的超时时间内不起作用。您可以将超时设置为更短的时间,但是当您使用Windows平台时,您应该知道这可能无法按您希望的那样工作。参考:microsoft.com/mspress/books/WW/sampchap/4287d.aspx。
此设置套接字的5秒超时。
-
经过一些测试-这似乎是整个套接字的生命周期-不只是socket_read
-
有趣的观察:如果您使用PHP_NORMAL_READ而不是PHP_BINARY_READ(默认值)作为socket_read()的第三个参数,它将忽略使用socket_set_option()设置的超时,并且将无限期地阻塞,直到发送某些信息为止。(在PHP 5.5.9中观察)
-
另一个有趣的观察:如果从数组中删除`usec`,它将不起作用
-
无法可靠运行,您无法信任它。我有很多情况下,即使配置了几毫秒的超时,它也会挂起几分钟。可能取决于TCP标志
-
在用socket_create()创建的主$socket上进行设置会影响socket_accept()超时和socket_read()超时。要仅影响socket_read()超时,请在使用$socket_name = socket_accept()创建的第二个套接字名称上进行设置。
您是否尝试过使用SO_RCVTIMEO
的socket_set_option
输入操作的超时值。
- 我试过了!我想我找到了一个带有socket_listen的解决方案以及一个time()2和一段时间的手动超时。
-
杰出的!那为我解决了。我现在有一个socket_read()对我来说超时。
我做了一个socket_listen,然后用time()2和一个while循环进行了手动超时,里面有nonblock set和socket_read()。似乎工作正常。有其他选择吗?
更新:我发现将套接字设置为非阻塞状态,然后使用socket_listen提供了我需要的超时时间。
-
噢,您正在接受与PHP的套接字连接。有点不同。 us3.php.net/manual/en/function.socket-select.php如果有任何可读取的内容,Select将返回套接字,否则将以您指定的超时超时。
1 2 3 4 5 6 7 8 9
| $read_socket = socket_select($read, $write = NULL, $except = NULL, 10); // 10 - Timeout
if($read_socket === FALSE)
$this->End();
elseif($read_socket === 0)
return FALSE;
$pdu_ = socket_read($this->session, 102400);
if($read_socket && !strlen($pdu_))
$this->End(); |