我的 Internet 连接出现了一些问题,我想知道检查主机是否连接到 Internet 的最快、无错误和最可靠的方法是什么。
我正在寻找类似的东西is_online()
,在线时返回 true,不在线时返回 false。
我的 Internet 连接出现了一些问题,我想知道检查主机是否连接到 Internet 的最快、无错误和最可靠的方法是什么。
我正在寻找类似的东西is_online()
,在线时返回 true,不在线时返回 false。
我已经对一些解决方案进行了基准测试:带有 HEAD 请求的file_get_contents 、 gethostbynamel、checkdnsrr和以下解决方案似乎比所有其他解决方案快 100 多:
function is_online()
{
return (checkdnsrr('google.com', 'ANY') && checkdnsrr('yahoo.com', 'ANY') && checkdnsrr('microsoft.com', 'ANY'));
}
每台主机大约需要 1 微秒,而file_get_contents
例如每台主机需要超过 1 秒(离线时)。
您可以向可能已启动的主机(例如 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;
}
你为什么不在流行的网站上做一些HTTP GET
(或者更好的速度)请求呢?HTTP HEAD
使用多数投票来决定答案。
您有时也可以依赖ping
(通过 PHP 中的系统调用),但请注意并非所有网站都响应 ICMP (ping) 请求。
请注意,通过增加您在得出结论之前发出的 ping/http 请求的数量有助于提高答案的可信度,但在最坏的情况下不能没有错误。
不要忘记这假设您的服务器将响应 ICMP 请求。如果是这样,那么我同意,Net_Ping 可能是要走的路。如果您无法使用同样在 PEAR 上的 Net_Socket 包来尝试连接到您知道会得到响应的某个端口 - 可能是端口 7 或端口 80,具体取决于您运行的服务。