【问题标题】:using PHP shell_exec so that the output is "piped" not "dumped"使用 PHP shell_exec 使输出是“管道”而不是“转储”
【发布时间】:2014-05-06 13:40:43
【问题描述】:

真的是快速提问。

考虑以下代码:

//__/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:这些一次一个到达,嘀嘀嘀嘀……

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 个大输出 1 个大等待。 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 以便输出每秒返回每一行

【问题讨论】:

  • 检查我的答案,它有效;)

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


【解决方案1】:

试试这个:

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 谢谢 :) 但你读错了,问题是“我怎样才能改变 /var/test/cli_test_shell.php”.. 你可能会注意到我已经“标记”了 passthru(),我如果没有你看到的 ob_flush's(),我不相信它会以这种方式正常运行
  • 它应该如何与 shell_exec() 一起工作? print 将在 shell_exec() 返回后执行。
  • shell_exec / exec / passthru 都是同一个问题,问题是我如何改变它以使 9 条管道线“活”,我最好的猜测是它是exec,在 $output 上带有 ob_flush 回调,但我不知道如何优雅地实现它
  • ... 如果您想同时获得即时输出和变量中的输出,您可以使用 popen() 或 proc_open()。那么你就可以完全控制管道了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多