【问题标题】:stream_socket_client freezes during 5 secondsstream_socket_client 在 5 秒内冻结
【发布时间】: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 地址时,一切正常!

标签: php sockets


【解决方案1】:

它没有忽略您的 1 秒超时,该时间没有用于尝试连接。您看到的延迟来自必要的 DNS 查找,因为您传递的是主机名而不是 IP 地址。

这不是一项快速的活动。你不想这样做。使用 IP 地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2018-11-19
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多