【发布时间】:2014-09-18 23:25:10
【问题描述】:
这是我的代码的一部分:
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);
}
似乎一切都运行良好,除了一些时间或 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
【问题讨论】:
-
while循环
while(true) {的目的是什么? -
我正在不断更新服务器 mywebsite.com 上的一些信息。
-
这是一个宾果游戏:延迟发生在
socket_connect期间。直接使用 IP 地址时,一切正常!