代码之家  ›  专栏  ›  技术社区  ›  Alix Axel

检查主机是否与PHP联机?

  •  1
  • Alix Axel  · 技术社区  · 15 年前

    我的互联网连接一直有一些问题,我想知道什么是最快,无错误和最可靠的方式来检查主机是否连接到互联网。

    我在找类似的东西 is_online() 在线时返回真,不在线时返回假。

    4 回复  |  直到 15 年前
        1
  •  6
  •   Alix Axel    15 年前

    我对一些解决方案进行了基准测试: file_get_contents 有了头部请求, gethostbynamel , checkdnsrr 以下解决方案似乎比所有其他解决方案都快100多个:

    function is_online()
    {
        return (checkdnsrr('google.com', 'ANY') && checkdnsrr('yahoo.com', 'ANY') && checkdnsrr('microsoft.com', 'ANY'));
    }
    

    每台主机大约需要一微秒,而 file_get_contents 例如,每台主机需要一秒钟以上的时间(脱机时)。

        2
  •  2
  •   Thomas    15 年前

    您可以向可能已启动的主机(如Google)发送ping。

    似乎没有内置的PHP,所以您必须使用shell命令。的返回值 ping 尼克斯可以告诉你是否收到了答复。

    更新 : ping -c1 -q -w1 在Linux上应该是正确的命令。如果收到了回复,这将给您退出代码0,否则,它将在一秒钟后超时。

    因此,类似这样的操作(警告,我的PHP已经生锈)应该可以做到:

    function is_online() {
        $retval = 0;
        system("ping -c1 -q -w1", $retval);
        return $retval == 0;
    }
    
        3
  •  1
  •   Alix Axel    14 年前

    你为什么不做一些 HTTP GET (或者更好) HTTP HEAD 对于速度)热门网站的请求?使用 多数表决 决定答案。

    你可以 有时 依靠 ping 也可以(通过PHP中的系统调用),但请注意,并非所有网站都响应ICMP(Ping)请求。

    注释 通过在得出结论之前增加ping/http请求的数量,可以帮助 置信水平 答案,但是 不能 在最坏的情况下不要出错。

        4
  •  0
  •   kguest wshcdr    15 年前

    不要忘记,这假定您的服务器将响应ICMP请求。如果是这样的话,那么我同意,网平可能是一条可行的道路。如果不成功,您可以使用同样在PEAR上的net_socket包尝试连接到某个您知道会得到响应的端口-可能是端口7或端口80,具体取决于您运行的服务。