PHP检查服务器是否在线

6

我需要检查一组服务器、路由器和交换机是否正常。我已经花费了一个多小时寻找一些可靠的工具,使用IP地址和端口进行测试。请问有谁能提供帮助吗?

最终我使用了

function ping($addr, $port='') {
    if(empty($port)) {
        ob_start();
        system('ping -c1 -w1 '.$addr, $return);
        ob_end_clean();
        if($return == 0) {
            return true;
        } else {
            return false;
        }
    } else {
        $fp = fsockopen("udp://{$addr}", $port, $errno, $errstr);
        if (!$fp) {
            return false;
        } else {
            return true;
        }
    }
}

你可以将第6行替换为 return $return === 0; - Keegan 82
3个回答

9
服务器、路由器和交换机......它们共同的特点是,如果运行了SNMP服务,则都能接受SNMP请求。听起来你正在尝试实现一个有趣的解决方案来监控系统(例如nagios等)。
根据:http://php.net/manual/en/book.snmp.php
 <?php
 $endpoints = array('10.0.0.1','10.0.0.2','10.0.0.3','10.0.0.4','10.0.0.5');
 foreach ($endpoints as $endpoint) {
      $session = new SNMP(SNMP::VERSION_2c, $endpoint, 'boguscommunity');
      var_dump($session->getError());
      // do something with the $session->getError() if it exists else, endpoint is up
 }
 ?>

这会告诉您端点是否在线以及SNMP服务是否正在运行。为了查看端口是否可用/打开,您可以使用fsockopen()

http://php.net/manual/en/function.fsockopen.php

 <?php
 $fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
 if (!$fp) {
      echo "ERROR: $errno - $errstr<br />\n";
 }
 ?>

我不太确定端点是用来做什么的?这是一个网络监视脚本,所以我只有一个IP和端口,或者一个HTTP地址,这能在fsockopen中工作吗?因为SNMP需要额外的服务器安装。 - Saulius Antanavicius
我需要检查一组服务器、路由器和交换机,其中 $endpoints 是一个占位符,您可以在其中定义它们。这为您提供了解决问题的思路。 - sdolgy

0

如果您正在检查mysql,可以使用类似以下的内容

    if (mysqli_ping($ip))  echo "sweet!";  
    else echo "oh dam";

我会有点担心使用ping选项,因为它可能会被阻止,而且突然之间...


1
我认为这更像是一条注释:既不是路由器也不是交换机会运行MySQL。 - bishop
不,我完全同意,我只是想把这个选项放在混合中,以防有人真的只是检查 SQL 或其他东西。 - Mike Q

0
$ip = "123.456.789.0";
$ping = exec("ping -c 1 -s 64 -t 64 ".$ip);

var_dump($ping);

// and so forth.

无论我输入什么IP地址,都会返回一个空白元素? - Saulius Antanavicius
£exec 似乎没有返回任何内容。 - Saulius Antanavicius
很奇怪。你是不是用的Windows? - vzwick
尝试将 ping 的完整路径放入代码中。PHP默认情况下可能没有该路径。 - sdolgy
我认为主机禁止使用exec() :/ - Saulius Antanavicius
参考 @sdolgy 的答案,这样可能更干净。 - vzwick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接