2017-04-18 40 views
0

我發現了一段代碼,顯示一個ping到通過PHP的服務器,我想知道是否有可能實現不同的輸出,但我在努力確定邏輯。邏輯的PHP和獲取第一個數組

代碼:

   <?php 
      $cmd = "ping 8.8.8.8 -c 1"; 

      $descriptorspec = array(
      0 => array("pipe", "r"), // stdin is a pipe that the child will read from 
      1 => array("pipe", "w"), // stdout is a pipe that the child will write to 
      2 => array("pipe", "w") // stderr is a pipe that the child will write to 
      ); 
      flush(); 
      $process = proc_open($cmd, $descriptorspec, $pipes, realpath('./'), array()); 
      echo "<pre>"; 
      if (is_resource($process)) { 
       while ($s = fgets($pipes[1])) { 
        print $s; 
       } 
      } 
      echo "</pre>"; 
      ?> 

電流輸出:

PING 8.8.8.8 (8.8.8.8): 56 data bytes 
64 bytes from 8.8.8.8: seq=0 ttl=54 time=28.278 ms 

--- 8.8.8.8 ping statistics --- 
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 28.278/28.278/28.278 ms 

通緝輸出:

我只希望MS值或 「時間」

28.278 

試驗:

我試圖抓住的「$s」或「$pipes」變量/陣列,包括通過以下運行它的數組值「[1]」等的一些試驗的值代碼:

str_replace("time=","@@",$test_stringget_ping_res); 
str_replace(" ms","@@",$test_stringget_ping_res); 

但我得到「無法打開規則文件」。

+0

所以,你只需要** **時間? – Rahul

+0

@Rahul從第二行開始! – ReConnected

回答

2

可以使用preg_match()如下。

preg_match('/time=(.*?) ms/', $s, $m); 
print $m[1]; 

你的代碼如下:

if (is_resource($process)) { 
while ($s = fgets($pipes[1])) { 
    preg_match('/time=(.*?) ms/', $s, $m); 
    print $m[1]; 
    print $s; 
    } 
} 

說明:time=ms之間簡單的捕捉一切。

Ideone Demo

檢查preg_match()文檔使用。

1

你可以改變你的命令:

ping -c 1 8.8.8.8 | tail -1 | cut -d/ -f 5 
+0

謝謝,但是我需要其他地方的整個輸出! – ReConnected