我想有一个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);
}
?>
这是正确的代码吗?
答案 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调用到一个远程主机,它挂起直到超时,其他的脚本将像独立的线程一样继续。