繁体   English   中英

使用PHP检查主机是否在线?

[英]Check if host computer is online with PHP?

我的Internet连接一直存在一些问题,我想知道什么是最快,无错误且最可靠的检查主机是否已连接到Internet的方法。

我正在寻找像is_online()这样的东西,当在线时返回true, is_online()返回false。

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

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

每个主机花费大约一微秒的时间,而例如file_get_contents每个主机花费超过一秒的时间(离线时)。

您可以向可能处于运行状态的主机(例如Google)发送ping命令。

似乎没有内置的PHP,因此您必须诉诸shell命令。 * nix上ping的返回值可以告诉您是否收到了回复。

更新 :在Linux上, ping -c1 -q -w1应该是正确的命令。 如果收到答复,这将为您提供退出代码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,具体取决于所运行的服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM