php socket 超时时间设置,php – socket_connect没有超时

我正在使用套接字将数据发送到可能没有响应的服务器.所以我试图通过在SO中使用此解决方案来定义超时.

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回答更简洁的解决方案

标签:php,sockets,timeout

来源: https://codeday.me/bug/20190831/1779147.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值