1

我的 Internet 连接出现了一些问题,我想知道检查主机是否连接到 Internet 的最快、无错误和最可靠的方法是什么。

我正在寻找类似的东西is_online(),在线时返回 true,不在线时返回 false。

4

4 回答 4

6

我已经对一些解决方案进行了基准测试:带有 HEAD 请求的file_get_contents 、 gethostbynamelcheckdnsrr和以下解决方案似乎比所有其他解决方案快 100 多:

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

每台主机大约需要 1 微秒,而file_get_contents例如每台主机需要超过 1 秒(离线时)。

于 2009-11-09T21:29:53.627 回答
2

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

似乎没有内置的 PHP,所以你必须求助于 shell 命令。on *nix的返回值ping可以告诉你是否收到了回复。

更新ping -c1 -q -w1应该是 Linux 上的正确命令。如果收到回复,这将为您提供退出代码 0,否则为其他内容,并在一秒钟后超时。

因此,这样的事情(警告,我的 PHP 生锈了)应该可以解决问题:

function is_online() {
    $retval = 0;
    system("ping -c1 -q -w1", $retval);
    return $retval == 0;
}
于 2009-11-08T12:15:40.223 回答
1

你为什么不在流行的网站上做一些HTTP GET(或者更好的速度)请求呢?HTTP HEAD使用多数投票来决定答案。

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

请注意,通过增加您在得出结论之前发出的 ping/http 请求的数量有助于提高答案的可信度,但在最坏的情况下不能没有错误。

于 2009-11-08T12:16:35.430 回答
0

不要忘记这假设您的服务器将响应 ICMP 请求。如果是这样,那么我同意,Net_Ping 可能是要走的路。如果您无法使用同样在 PEAR 上的 Net_Socket 包来尝试连接到您知道会得到响应的某个端口 - 可能是端口 7 或端口 80,具体取决于您运行的服务。

于 2009-11-08T14:14:07.177 回答