我的互联网连接遇到了一些问题,我想知道检查主机是否连接到互联网的最快,最无差错和最可靠的方法是什么。
我正在寻找像is_online()
这样的东西,在线时返回true,不在时返回false。
答案 0 :(得分:6)
我已经对一些解决方案进行了基准测试:file_get_contents与HEAD请求,gethostbynamel,checkdnsrr以及以下解决方案似乎比其他解决方案快100多倍:
function is_online()
{
return (checkdnsrr('google.com', 'ANY') && checkdnsrr('yahoo.com', 'ANY') && checkdnsrr('microsoft.com', 'ANY'));
}
每个主机大约需要1微秒,而file_get_contents
每个主机需要超过1秒(离线时)。
答案 1 :(得分:2)
您可以向可能已启动的主机(例如Google)发送ping。
似乎没有内置PHP,因此您必须使用shell命令。
更新:ping -c1 -q -w1
应该是Linux上正确的命令。如果收到回复,这将为您提供退出代码0,否则为其他内容,并在一秒钟后超时。
因此,这样的事情(警告,我的PHP生锈)应该可以解决这个问题:
function is_online() {
$retval = 0;
system("ping -c1 -q -w1", $retval);
return $retval == 0;
}
答案 2 :(得分:1)
为什么不在热门网站上执行大量HTTP GET
(或更好的HTTP HEAD
速度)请求?使用多数投票来决定答案。
您有时依赖ping
(通过PHP中的系统调用),但请注意并非所有网站都响应ICMP(ping)请求。
注意通过在得出结论之前增加ping / http请求的数量有助于答案的置信度,但不能< / em>在最糟糕的情况下没有错误。
答案 3 :(得分:0)
不要忘记这假设您的服务器将响应ICMP请求。如果是这样,那么我同意,Net_Ping可能就是这样。如果你没有使用Net_Socket软件包,也可以在PEAR上尝试连接到你知道会得到响应的某个端口 - 可能是端口7或端口80,具体取决于你运行的服务。