php ping 的相关总结
因为主要学习使用的是php语言,最近要进行一些主机间联通判断,下面是根据一些获取联通状态的总结整理
1、ping IP
代码如下
function pingIp($ip)
{ /*判断服务器环境*/
if (PATH_SEPARATOR==':')//linux
{
/*通过exec执行ping命令 执行一次 返回值输出到$info*/
exec("ping $ip -c 1",$info);
if (count($info) < 6)
{
return '-1';
}
/*获取ping的时间*/
$str = $info[count($info)-1];
return round(substr($str, strpos($str,'/',strpos($str,'='))+1 , 4));
} else {//windows
exec("ping $ip -n 1",$info);
if (count($info) < 6) {
return '-1';
}
/*获取ping的时间*/
$str = $info[count($info)-1];
return substr($str, strripos($str,'=')+1);
}
}
$result = pingIPIP('172.23.143.50');
var_dump($result);
2、ping TCP
此方法采用了php一系列socket的相关函数,在windows上可能有些问题
代码如下:
function pingTcp($ip,$port){
$pingTcp = '';
/*创建socket*/
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
/*设置不锁定状态*/
socket_set_nonblock($sock);
/*初始化连接*/
socket_connect($sock,$ip, $port);
/*锁定socket*/
socket_set_block($sock);
switch(socket_select($r = array($sock), $w = array($sock), $f = array($sock),5))
{
case 2:
echo "连接被拒绝!n";
$pingTcp = 2;
break;
case 1:
echo "成功连接n";
$pingTcp = 1;
break;
case 0:
echo "连接超时n";
$pingTcp = 0;
break;
}
return $pingTcp;
}
3、使用fsockopen
fsockopen 类似一种文件操作, 打开一个网络连接或者一个Unix套接字连接,初始化一个套接字连接到指定主机(hostname
)。
fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )
$host = '172.23.143.50'; //要ping的地址,也可以是IP
$port = '22'; //要ping的端口
$num = 3;//查询次数
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function ping($host,$port)
{
$time_start = microtime_float();
$ip = gethostbyname($host);
$fp = fsockopen($host,$port,$errno,$errstr,1);
if(!$fp) return 'replay time out!';
$get = "GET / HTTP/1.1\r\nHost:".$host."\r\nConnection: Close\r\n\r\n";
fputs($fp,$get);
fclose($fp);
$time_end = microtime_float();
$time = $time_end - $time_start;
$time = ceil($time * 1000);
return 'Reply from '.$ip.': time='.$time.'ms<br />';
}
for($i = 0;$i < $num;$i++)
{
var_dump(ping($host,$port));
sleep(1);
ob_flush();
flush();
}
因为环境的不同,某些情况下在Unix套接字连接或者自定义的连接设置连接时限(timeout
)可能不会生效。