以下是我的代码的一部分:
while(true)
{
$socket_options = array(
'socket' => array(
'bindto' => 'X.X.X.X:0'
)
);
$context = stream_context_create($socket_options);
$fp = stream_socket_client('tcp://mywebsite.com:80', $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $context);
fclose($fp);
}
似乎eveything运行良好,除了一段时间或do $fp = stream_socket_client(...)
的时间大约需要5秒。通常需要大约0.05秒。
正如你所看到的,我添加了1秒的超时而忽略了。在这5秒之后,一切似乎都运行正常。
使用tcpdump,我试图看看会发生什么:例如在18:00:00,我们运行函数$fp = stream_socket_client(...)
。我们没有错误,tcpdebug也没有任何痕迹。在18:00:05,这个函数解冻,所以我们得到了tcpdebug中的第一个跟踪:
18:00:05.383328 IP4 XXX.39881 > YYY: Flags [S], seq 888461900, win 28800, options [mss 1440,sackOK,TS val 132651022 ecr 0,nop,wscale 7], length 0
18:00:05.385622 IP4 YYY > XXX.39881: Flags [S.], seq 2116836106, ack 888461901, win 14280, options [mss 1440,sackOK,TS val 1826003082 ecr 132651022,nop,wscale 7], length 0
这些人似乎在没有任何解决方案的情况下遇到同样的问题:PHP stream_socket_client ignoring timeout
修改
经过一些测试,socket_create
发生了同样的问题:
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, 'X.X.X.X');
socket_connect($sock, 'mywebsite.com', 80);
[...]
socket_close($sock);
以下是某些IP的响应时间:
X.X.X.18 : 5.2102129459381
X.X.X.29 : 5.1817638874054
X.X.X.11 : 5.2263398170471
X.X.X.78 : 5.2547619342804
X.X.X.56 : 5.1963429450989
X.X.X.24 : 5.1876528263092
答案 0 :(得分:1)
它没有忽略你的1秒超时,没有花时间尝试连接。您看到的延迟来自DNS查找,因为您传入的是主机名而不是IP地址。
这不是一项快速活动。你不想这样做。使用IP地址。