3

任何人都知道在 php 中 ping IP 地址并仅回显平均 ping 时间的结果的简单干净方法吗?

例如,当我真正想要的是“35”时,我会得到“最小值 = 35ms,最大值 = 35ms,平均值 = 35ms”

谢谢。

4

3 回答 3

5

您可以使用exec()-function 执行 shell 命令ping,如下例所示:

 <?php
    function GetPing($ip=NULL) {
     if(empty($ip)) {$ip = $_SERVER['REMOTE_ADDR'];}
     if(getenv("OS")=="Windows_NT") {
       $ping=explode(",", $exec);
       return $ping[1];//Maximum = 78ms
     }
     else {
      $exec = exec("ping -c 3 -s 64 -t 64 ".$ip);
      $array = explode("/", end(explode("=", $exec )) );
      return ceil($array[1]) . 'ms';
     }
    }

    echo GetPing();
    ?>

来源: http: //php.net/manual/en/function.exec.php

于 2012-09-27T06:01:40.007 回答
5

我想你想要的是这样的:

const PING_REGEX_TIME = '/time(=|<)(.*)ms/';
const PING_TIMEOUT = 10;
const PING_COUNT = 1;

$os = strtoupper(substr(PHP_OS, 0, 3));
$url = 'www.google.com';

// prepare command
$cmd = sprintf('ping -w %d -%s %d %s',
    PING_TIMEOUT,
    $os === 'WIN' ? 'n' : 'c',
    PING_COUNT,
    escapeshellarg($url)
);

exec($cmd, $output, $result);

if (0 !== $result) {
    // something went wrong
}

$pingResults = preg_grep(PING_REGEX_TIME, $output); // discard output lines we don't need
$pingResult = array_shift($pingResults); // we wanted just one ping anyway

if (!empty($pingResult)) {
    preg_match(PING_REGEX_TIME, $pingResult, $matches); // we get what we want here

    $ping = floatval(trim($matches[2])); // here's our time
} else {
    // something went wrong (mangled output)
}

这是一个仅从单个 ping 中获取 ms 的示例,但很容易对其进行调整以获得您想要的任何内容。您所要做的就是使用正则表达式、超时和计数常量。

您可能还想根据操作系统调整正则表达式(或添加更多),因为 Linux ping 将提供与 Windows 不同格式的结果。

于 2016-10-18T15:34:31.577 回答
4

不久前在网上找到了这个函数,对不起,我不记得在哪里归功于,但你可以将它与 for 循环一起使用来获得平均值:

function ping($host, $timeout = 10) 
{ 
    $output = array(); 
    $com = 'ping -n -w ' . $timeout . ' -c 1 ' . escapeshellarg($host); 
    $exitcode = 0; 
    exec($com, $output, $exitcode); 
    if ($exitcode == 0 || $exitcode == 1) 
    {
        foreach($output as $cline) 
        { 
            if (strpos($cline, ' bytes from ') !== FALSE) 
            { 
                $out = (int)ceil(floatval(substr($cline, strpos($cline, 'time=') + 5))); 
                return $out; 
            } 
        } 
    } 

    return FALSE; 
}

$total = 0;
for ($i = 0; $i<=9; $i++)
{
        $total += ping('www.google.com');
}

echo $total/10;

只需根据需要更改 for 循环中的次数..

于 2012-09-27T06:10:14.260 回答