使用PHP shell_exec使输出“管道”而不是“转储”

时间:2014-05-06 13:40:43

标签: php exec shell-exec command-line-interface passthru

真的很快。

请考虑以下代码:

//__/var/test/cli_test.php__
$x = 0;
while ($x < 9){
  print "loop " . str_pad($x, 3, "0", STR_PAD_LEFT) . "\n";
  sleep(1);
  $x++;
}

如果我在命令行中输入php /var/test/cli_test.php,我会得到9个间隔时间线,即9个正输出,每秒一个。 EG:这些一次到达一个,blip blip blip ...

loop 000 
loop 001 
loop 002 
loop 003 
loop 004 
loop 005 
loop 006 
loop 007 
loop 008 

现在考虑一个不同的命题

//__/var/test/cli_test_shell.php
print shell_exec("php /var/test/cli_test.php");

如果我在命令行中输入php /var/test/cli_test_shell.php,我什么也得不到9秒然后一切都到了..即1 BIG输出1 BIG等待。 9秒之后什么都没有EG:等等,等等......没有那么倾倒:

loop 000 
loop 001 
loop 002 
loop 003 
loop 004 
loop 005 
loop 006 
loop 007 
loop 008 

如何更改/var/test/cli_test_shell.php以便输出每秒返回每行

2 个答案:

答案 0 :(得分:1)

使用shell_exec()无法实现所需的行为。这是因为该函数收集命令的输出并将其作为字符串返回 - 在命令终止后。请改用passthru()并保持cli_test.php原样。

答案 1 :(得分:1)

试试这个:

$handle = popen('php /var/test/cli_test_shell.php 2>&1', 'r');
while (!feof($handle)) {
  echo fread($handle, 8192);
}
fclose($handle);