PHP挂起问题与passthru()/ system()调用和输出缓冲

时间:2016-09-29 20:42:00

标签: php linux system ping output-buffering

我确实有一个奇怪的问题。我试图在PHP中绕过输出缓冲来运行system()调用并获得即时输出。它工作得很好,但由于一些奇怪的原因,ping命令在" test.de"不会像google.de上的ping一样呈现即时输出。我确实看到了ping test.de'的第一行。立即在linux shell中,但它并没有立即出现在这个脚本中。有人可以帮忙吗?

<?php

  // Turn off output buffering
  ini_set('output_buffering', 'off');
  // Turn off PHP output compression
  ini_set('zlib.output_compression', false);
  // Implicitly flush the buffer(s)
  ini_set('implicit_flush', true);
  ob_implicit_flush(true);
  // Clear, and turn off output buffering
  while (ob_get_level() > 0) {
      // Get the curent level
      $level = ob_get_level();
      // End the buffering
      ob_end_clean();
      // If the current level has not changed, abort
      if (ob_get_level() == $level) break;
  }
  // Disable apache output buffering/compression
  if (function_exists('apache_setenv')) {
      apache_setenv('no-gzip', '1');
      apache_setenv('dont-vary', '1');
  }

  header('Cache-Control: no-cache');

  $i=0;
  while( $i < 1000 ) {
    $i++;
    echo '                        ';
  }
  echo '<pre>';
  echo "Pinging google.de \n\n";
  passthru("ping -w 10 -c 4 google.de");
  echo "\n\nPinging test.de \n\n";
  passthru("ping -w 10 -c 4 test.de");
  echo '</pre>';
?>

我在此输出中标记了延迟行:

Pinging google.de 

PING google.de (172.217.16.131) 56(84) bytes of data.
64 bytes from zrh04s06-in-f131.1e100.net (172.217.16.131): icmp_seq=1 ttl=56 time=22.0 ms
64 bytes from zrh04s06-in-f131.1e100.net (172.217.16.131): icmp_seq=2 ttl=56 time=22.0 ms
64 bytes from zrh04s06-in-f131.1e100.net (172.217.16.131): icmp_seq=3 ttl=56 time=22.2 ms
64 bytes from zrh04s06-in-f3.1e100.net (172.217.16.131): icmp_seq=4 ttl=56 time=22.0 ms

--- google.de ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 22.016/22.067/22.200/0.130 ms


Pinging test.de 

PING test.de (104.45.6.189) 56(84) bytes of data. <<<< THAT line is delayed!!

--- test.de ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 9999ms

2 个答案:

答案 0 :(得分:1)

<强>解决方案:

显然它与linux缓冲有关。我已经重做了shell命令,所以它现在正在运行。解决方案是使用script命令包装linux命令。所以:

passthru("script -q -c 'ping -w 10 -c 4 test.de' /dev/null")

这篇文章帮助:https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

答案 1 :(得分:0)

我认为这是因为你使用的是system()函数,因为它只返回最后一行。您可能更适合使用passthru()exec()函数。这是关于这些功能的作用及其差异的一篇很好的文章:

https://stackoverflow.com/a/21016100/1789650

根据评论进行更新

您可能还想尝试将输出参数附加到shell脚本。将2>&1附加到行的末尾,它会将每个新的shell输出行放入变量中。这是它应该是什么样子:

exec("ping -w 10 -c 4 google.de 2>&1", $output );
print_r( $output );