PHP可以在没有ICMP且没有外部程序的情况下ping远程系统吗?

时间:2012-12-13 16:42:46

标签: php ping

我想检查另一台机器是否通常用PHP响应。

大多数方法都是对目标计算机上运行的某些服务执行ping操作,但我想检查计算机是否一般在线。

我发现http://birk-jensen.dk/2010/09/php-ping/应该发送一个ICMP Ping包。问题是,某种方式需要root才能执行socket_create(AF_INET, SOCK_RAW, 1)。通过posix_seteuid(0)的解决方法也不起作用,因为也需要提升权限。

任何让我运行ping程序的函数在我的场景中都不可用。

那么如何使用php检查服务器是否在线?

2 个答案:

答案 0 :(得分:1)

你总是可以使用Net_Ping来ping php http://pear.php.net/package/Net_Ping/redirected

答案 1 :(得分:1)

为此你可能想尝试,这是不太可能提供有意义的数据,但是有些东西需要考虑。

如果你打开一个随机端口的tcp套接字而不是超时,它会立即关闭。然后机器“向上”,但这并不意味着更多。它可能是一个内核恐慌。

并且超时并不意味着机器已关闭。只是它没有拒绝tcp握手而是丢弃了它。

你不能用这个得到任何有意义的计时数据,但是如果有问题的机器打开或关闭,它会给出更多有根据的猜测。

<?php
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_connect ( $sock , string $address,22 ) === true) {
switch(socket_last_error($sock)) {
    case 110:
    case 112:
    case 113:
       echo 'Machine may be down';
       break;
    case 111:
       echo 'Machine may be up';
       break;
    case 115:
       echo 'Machine is up';
       break;
    default:
       echo 'Machine in unknown state.';
       break;
}

你已经声明你不能使用ping命令,因此Net_Ping不会工作,因为它只是操作系统中ping命令的一个奇特的接口