有没有办法检查主机是否已启动?

时间:2011-01-13 22:46:18

标签: php ping fsockopen

我正在尝试在PHP中执行此操作。我需要检查指定的主机是否“up”

我想到ping指定的主机(虽然我不确定我会怎样,因为那需要root。 - help这里?)

我也使用fsockopen()尝试连接指定端口,但如果主机没有侦听该端口上的连接,那也会失败。

此外,有些主机会阻止ping请求,那么我该如何解决这个问题呢?但这部分并不是必需的,所以不必过于担心。我意识到这个可能会变得棘手。

5 个答案:

答案 0 :(得分:4)

我通常会为公共页面执行一个简单的cURL,看看它是否返回200.如果你得到500,404或者200响应以外的任何内容,你就会知道有些可疑。

答案 1 :(得分:3)

简短的回答是没有好的,通用的方法来做到这一点。 Ping尽可能接近(几乎所有主机都会响应),但正如您所观察到的那样,在PHP中通常需要root访问才能使用低端口。

您的主机是否允许您执行系统调用,因此您可以在操作系统级别运行ping命令,然后解析结果?这可能是你最好的选择。

$result = exec("ping -c 2 google.com");

如果主机阻止ping请求,您可以执行更通用的端口扫描以查找其他开放端口(但这非常粗鲁,不要对未授予您特定权限的主机执行此操作)。 Nmap是执行此操作的好工具。它使用了很多技巧来确定主机是否正常运行以及可能运行或未运行的服务。但要小心,因为如果您安装并使用Nmap,某些共享托管服务提供商将终止您的帐户“黑客活动”,尤其是针对您无法控制或有权进行探测的主机。

除此之外,如果您与另一台主机位于同一个未切换的以太网层(例如,如果您恰好位于同一个开放的WiFi网络上),则混杂模式下的以太网适配器甚至可以嗅探来自主机的流量如果它没有直接回应你。

答案 2 :(得分:1)

您可以使用cURL

$url = 'yoururl';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (200==$retcode) {
    // All's well
} else {
    // not so much
}

答案 3 :(得分:0)

对于要监控的主机,必须至少打开一个端口。主机是Web服务器吗?如果是这样,您只需打开与端口80的连接,只要它成功打开,然后至少部分主机正在工作。

更好的解决方案是拥有一个只能由您的监视器访问Web的脚本,然后您可以打开与该连接的连接,该脚本将返回各种系统信息。

编辑 -

您希望此测试有多彻底? [服务器开] - > [apache running] - > [网络应用程序工作] 是否所有不同的工作水平。只是显示apache返回的东西至少显示服务器已启用,但不是你的web应用程序正在运行。 (我意识到你可能没有运行这样的东西,但我希望它是一个有用的例子)

编辑 -

是否值得安装一个轻量级的http服务器(我的意思是非常轻量级),仅用于监控?

如果不这样,你可以在经常打电话回家的主机上安装一些东西,以证明它们已经启动了吗?

答案 4 :(得分:0)

我使用了gethostbyname($hostname)

如果主机已启动,该功能将为您提供IP,如果找不到IP,则为您提供输入的主机名。

if ($hostname !== gethostbyname($hostname)) {
    //Host is up
}