php ping 的相关总结

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)可能不会生效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值