是啥导致 PHP 出现这种延迟?

Posted

技术标签:

【中文标题】是啥导致 PHP 出现这种延迟?【英文标题】:What causes this delay in PHP?是什么导致 PHP 出现这种延迟? 【发布时间】:2015-01-07 10:56:35 【问题描述】:

我有一个关于我编写的用于连接到来自 IRC 服务器的收集统计信息的 php 脚本的问题,作为一个测试,因为我是 PHP 新手并且仍在学习。

这是脚本:

<?php
set_time_limit(0);

$servers = array(
           "irc.icq.com",
           "irc.quakenet.org"
);

function get_statistics ($server, $port) 
    $nick   = 'IRCDir' . rand(1000, 9999);
    $irc = fsockopen($server, $port);

    fputs($irc,"USER $nick 0 * :$nick\n");
    fputs($irc,"NICK $nick\n");


    while ($data = fgets($irc, 128)) 

        $ex = explode(' ', $data);

        if (isset($ex[0]) && $ex[0] == "PING") 
            fputs($irc, "PONG ".$ex[1]."\n");
        

        if (count($ex) > 0) 

            if (isset($ex[1]) && $ex[1] == "001") 
                $network = $ex[6];
                echo date('h:i:s') . " network: " . $server;
                echo "\n";
            

            if (isset($ex[1]) && $ex[1] == "002") 
                $server = str_replace(',', '', $ex[6]);
                echo date('h:i:s') . " server: " . $server;
                echo "\n";
            

            if (isset($ex[1]) && $ex[1] == "251") 
                $users   = $ex[5] + $ex[8];
                $servers = $ex[11];
                echo date('h:i:s') . " users: " . $users;
                echo "\n";
                echo date('h:i:s') . " servers: " . $servers;
                echo "\n";
            

            if (isset($ex[1]) && $ex[1] == "252") 
                $ircops = $ex[3];
                echo date('h:i:s') . " ircops: " . $ircops;
                echo "\n";
            

            if (isset($ex[1]) && $ex[1] == "254") 
                $channels = $ex[3];
                echo date('h:i:s') . " channels: " . $channels;
                echo "\n";
            

        

    
    fclose($irc);


foreach ($servers as $server) 
    echo date('h:i:s') . " getting statistics for " . $server;
    echo "\n";
    get_statistics($server, '6667');


exit;
?>

这是输出:

root@li140-48:~# php bot.php
11:04:23 getting statistics for irc.freenode.net
11:04:24 network: irc.freenode.net
11:04:24 server: sendak.freenode.net
11:04:24 users: 90601
11:04:24 servers: 26
11:04:24 ircops: 22
11:04:24 channels: 50958
11:05:25 getting statistics for irc.icq.com
11:05:26 network: irc.icq.com
11:05:26 server: irc-k01a.orange.icq.com
11:05:26 users: 2671
11:05:26 servers: 3
11:05:26 ircops: 16
11:05:26 channels: 810
11:06:26 getting statistics for irc.quakenet.org
11:06:28 network: irc.quakenet.org
11:06:28 server: blacklotus.ca.us.quakenet.org
11:06:28 users: 37648
11:06:28 servers: 40
11:06:28 ircops: 67
11:06:28 channels: 26711
root@li140-48:~#

我的问题是是什么导致了被索引的服务器之间的延迟?

在 10.24:19,它已经完成了 irc.icq.com 的索引,所以此时它应该断开连接并立即索引阵列中的下一个服务器,但不是这样,它在这样做之前等待了整整一分钟,但我有脚本中没有提到一分钟?

希望有PHP高手可以伸出援手!

【问题讨论】:

总是正好是 60 秒吗? 考虑到正好 60秒,看起来PHP在等待什么,或者IRC服务器在等待什么。无论哪种方式,都无法让连接断开,它必须超时。 @dwhite.me 我正在向阵列添加更多服务器,并用更多结果更新问题。 @NiettheDarkAbsol 我希望脚本在收集完所有变量后关闭连接。我想我做错了,或者 fclose 在错误的地方...... 我的猜测是你的 pong 代码被破坏了,你永远无法摆脱循环。它总是在等待服务器结束连接。 【参考方案1】:

60 秒是默认的套接字超时。在获得所有要获取的信息后,您将继续尝试从流中读取 - 直到最终达到超时。

【讨论】:

有建议的方法吗?我想我现在的fclose($irc); 是没有意义的。我应该把它移到$channels 块内吗? @GeraldSchneider 谢谢,很简单:P 我不知道 IRC 的回答不够好​​.. 但您应该查看流中的指示符,您已完成,然后fclose 连接和break 循环

以上是关于是啥导致 PHP 出现这种延迟?的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致我的网络服务出现此 403 错误?

控制 HTML5 视频元素时导致延迟的原因是啥?

打开网页很慢 还出现502 Bad Gateway 请问是啥原因啊?

移动 Safari/Chrome 上的 Angular 应用程序中出现严重的键盘延迟

iPad Safari 滚动会导致 HTML 元素消失并延迟重新出现

打开 WebSocket 会导致 Google App Engine 上出现延迟峰值