我正在使用套接字将数据发送到可能没有响应的服务器.所以我试图通过在SO中使用此解决方案来定义超时.
Make PHP socket_connect timeout
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 1, 'usec' => 0));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 1, 'usec' => 0));
这在连接完成且服务器响应时间过长时有效.
但是当它无法创建连接socket_connect($socket,$addr,$port)时;超时约为20秒.
为什么会发生20秒超时,如何在1秒后强制连接创建超时?
解决方法:
您可以通过切换到非阻塞套接字来执行此操作,循环直到获得连接或达到超时,然后再次返回阻止.
// an unreachable address
$host = '10.0.0.1';
$port = 50000;
$timeout = 2;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// switch to non-blocking
socket_set_nonblock($sock);
// store the current time
$time = time();
// loop until a connection is gained or timeout reached
while (!@socket_connect($sock, $host, $port)) {
$err = socket_last_error($sock);
// success!
if($err === 56) {
print('connected ok');
break;
}
// if timeout reaches then call exit();
if ((time() - $time) >= $timeout) {
socket_close($sock);
print('timeout reached!');
exit();
}
// sleep for a bit
usleep(250000);
}
// re-block the socket if needed
socket_set_block($sock);
编辑:如果您使用的是使用fsockopen()或stream_socket_client()创建的套接字,请参阅@letiagoalves回答更简洁的解决方案
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。