如何ping两个服务器地址?

时间:2014-02-06 08:43:24

标签: php ping

我想有一个ping两个服务器的PHP代码然后如果这些服务器是在线的PHP代码echo online

这是我的代码:

$ip = "IP1"; //IP or web address
$port = "22"; //Port
$ip2 = "IP2"; //IP or web address
$port2 = "22"; //Port
$sock = @fsockopen( $ip, $port, $num, $error, 5 ); //2 is the ping time, you can sub what you need
$sock2 = @fsockopen( $ip2, $port2, $num2, $error2, 5 ); //2 is the ping time, you can sub what you need
if( !$sock & !$sock2 ){
//Do this if it is closed
    echo '<img title="Offline" src="../images/down.png">';
    }
if( $sock & $sock2 ){
//Do this if it is open
    echo '<img title="Online" src="../images/up.png">';
    fclose($sock);
    fclose($sock2);
}
?>

这是正确的代码吗?

1 个答案:

答案 0 :(得分:0)

你的代码有一些非常小的问题:如果一个袜子是打开而另一个没有,你就不会关闭打开的套接字(PHP可能会在脚本末尾关闭它),因为你只关闭它们如果两者都是开放的您使用二进制和(&amp;)而不是逻辑和&amp;&amp; if( $sock && $sock2 ) {,以及使用/>结束图片代码始终是一个好主意,以使其符合每种HTML风格。

以下是多服务器版本:

<?php

    $SERVERS_TO_TEST=array(
        array(
            'IP'=>'192.168.100.1',
            'PORT'=>22,
            'TIMEOUT'=>5,
        ),
        array(
            'IP'=>'192.168.100.101',
            'PORT'=>22,
            'TIMEOUT'=>5,
        ),
    );

    $ALL_ONLINE=TRUE;
    $COUNT_ONLINE=0;
    $COUNT_ALL=count($SERVERS_TO_TEST);
    foreach($SERVERS_TO_TEST as $aServer) {
        $ip = $aServer['IP'];
        $port = $aServer['PORT'];
        $timeout = $aServer['TIMEOUT'];

        $errNum=0;
        $errStr='';

        $sock = fsockopen( $ip, $port, $errNum, $errStr, $timeout );
        if($sock!==FALSE) {
            fclose($sock1);
            $COUNT_ONLINE++;
        } else $ALL_ONLINE=FALSE;
    }

    if($ALL_ONLINE){
        echo '<img alt="All online" title="All online" src="../images/up.png" />';
    } else {
        $perc=($COUNT_ALL-$COUNT_ONLINE).'/'.$COUNT_ALL;
        echo '<img alt="Offline '.$perc.'" title="Offline '.$perc.'" src="../images/down.png" />';
    }
?>

如果你为许多服务器测试这种方式,这将需要一段时间,但有一些方法可以使它甚至从网络服务器(没有线程)并行运行所有测试,你必须制作一个脚本来测试一个服务器“seeifonline.php”(服务器是url的参数),然后多次打开该脚本,使用非阻塞套接字到localhost,80(他们将立即回复)并手动编写'GET seeifonline.php?sever = $ server'与每个服务器使用不同的$ server。等待所有回复的循环。它很复杂,但它可以工作,你可以在同一时间检查20个服务器的状态(5秒超时)。主要的区别是你知道你的localhost服务器是在线的,所以所有那些fsockopens到localhost都会立即回复并启动脚本。该脚本将fsockopen调用到一个远程主机,它挂起直到超时,其他的脚本将像独立的线程一样继续。