1

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

我想过 ping 指定的主机(虽然我不确定我会怎么做,因为那需要 root。--help here?)

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

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

4

5 回答 5

5

我通常会为公共页面做一个简单的 cURL 并查看它是否返回 200。如果您收到 500、404 或除 200 响应之外的任何内容,您就知道有问题了。

于 2011-01-13T22:49:11.903 回答
4

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

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

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

如果主机阻止了 ping 请求,您可以进行更通用的端口扫描以查找其他开放端口(但这很粗鲁,不要对没有给您特定权限的主机这样做)。Nmap是一个很好的工具。它使用了很多技巧来确定主机是否已启动以及哪些服务可能正在运行或可能未运行。不过要小心,因为如果您安装和使用 Nmap,一些共享主机提供商会因“黑客活动”而终止您的帐户,尤其是针对您无法控制或无权探测的主机。

除此之外,如果您与另一台主机位于同一个未交换的以太网层(例如,如果您恰好位于同一个开放 WiFi 网络上),则处于混杂模式的以太网适配器可以嗅探进出主机的流量,即使它确实如此不直接回复你。

于 2011-01-13T22:49:03.617 回答
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
}
于 2011-01-13T23:07:42.680 回答
0

要完全监控主机,必须至少打开一个端口。主机是网络服务器吗?如果是这样,您可以只打开到端口 80 的连接,只要它成功打开,那么至少主机的某些部分正在工作。

一个更好的解决方案是让您的显示器可以通过网络访问脚本,然后您可以打开到该脚本的连接,该脚本将返回各种系统信息。

编辑 -

你希望这个测试有多彻底?[server on] -> [apache running] -> [web application working] 都是不同级别的工作。仅显示 apache 正在返回某些内容至少表明服务器已打开,但不能表明您的 Web 应用程序正在运行。(我意识到你可能没有运行这样的东西,但我希望这是一个有用的例子)

编辑 -

是否值得安装一个轻量级的 http 服务器(我的意思是重量很轻)只是为了监控?

如果做不到这一点,您是否可以在经常打电话回家以显示它们已启动的主机上安装一些东西?

于 2011-01-13T22:51:00.280 回答
-1

我用过gethostbyname($hostname)

该函数在主机启动时为您提供 IP,如果找不到 IP,则为您提供输入主机名。

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

于 2020-04-14T10:03:15.460 回答