代码之家  ›  专栏  ›  技术社区  ›  Vojtěch Å alda

php stream\u socket\u客户端第一次调用花费的时间太长

  •  2
  • Vojtěch Å alda  · 技术社区  · 6 年前

    我打开多个(75)流通过 stream_socket_client() stream_select()

    代码:

    foreach ($tlds as $index => $server ) {
    
        $ip = gethostbyname($server);
        $con = @stream_socket_client($ip.':43',$errno, $errstr, 10, STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT);
    
        usleep(200);
    
        if (!$con) {
            $fails[] = $server;
        } else {
            $calls[$index] = $con;
            stream_set_blocking($calls[$index], false);
        }
    
        //get time here
    }
    

    ╔════════╦══════════╦══════════╗
    ║ $index ║ 1st call ║ 2nd call ║
    ╠════════╬══════════╬══════════╣
    ║ 0      ║ 5s       ║ 0s       ║
    ╠════════╬══════════╬══════════╣
    ║ 10     ║ 6s       ║ 0s       ║
    ╠════════╬══════════╬══════════╣
    ║ 20     ║ 7s       ║ 0s       ║
    ╠════════╬══════════╬══════════╣
    ║ 30     ║ 9s       ║ 0s       ║
    ╠════════╬══════════╬══════════╣
    ║ 40     ║ 11s      ║ 0s       ║
    ╠════════╬══════════╬══════════╣
    ║ 50     ║ 12s      ║ 0s       ║
    ╠════════╬══════════╬══════════╣
    ║ 60     ║ 13s      ║ 0s       ║
    ╠════════╬══════════╬══════════╣
    ║ 70     ║ 14s      ║ 1s       ║
    ╠════════╬══════════╬══════════╣
    ║ end    ║ 14s      ║ 1s       ║
    ╚════════╩══════════╩══════════╝
    

    我在socket编程方面一点经验都没有,所以我很乐意得到任何提示。

    PHP 7.1、Apache/2.4.6(CentOS)

    注意:有时第二次通话的时间仍占第一次通话时间的1/3左右。但接下来的通话时间大约是1秒甚至更短。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Pavel    6 年前

    我想你的DNS延迟有问题。您可以在linux控制台中尝试这个in循环来检测它。

    time nslookup $server
    

    如果您确认dns速度慢,则可以使用NSCD服务进行记录的本地缓存。 yum -y install nscd;systemctl enable nscd;systemctl start nscd; 重启httpd服务后。nscd的统计数据: /usr/sbin/nscd -g