【问题标题】:Echo executed command's result line by line逐行回显执行命令的结果
【发布时间】:2015-01-13 01:55:41
【问题描述】:

我有一个使用shell_exec() 在Linux 上运行命令的php 文件。此命令需要一些时间才能完成,并且在每个阶段都会打印出一些内容。我希望php回显命令在打印时打印的每一行。

我发现使用ob_flush()flush() 可以做出这样的分块http 响应,但是我不能在打印行时回显它们,因为shell_exec() 等到命令完成然后返回输出。这样,当命令一次性终止时,行会被回显。

我认为我应该避免将shell_exec() 用于此目的。我还能如何做到这一点?

【问题讨论】:

标签: php linux command exec


【解决方案1】:

您需要刷新输出缓冲区才能立即打印:

echo "hello world\n";
flush();

查看flush()的文档

【讨论】:

  • OOps .. 没有仔细阅读这个问题。您已经在使用flush()。但是flush() 应该可以工作! .. 您是否将命令传递给另一个命令?
  • 你肯定没有仔细阅读这个问题。我对其进行了编辑以更好地传达我的意思。我希望它很清楚。
  • 在 Linux 上尝试:shell_exec('stdbuf -o0 command');。有用吗?
  • 请注意,链接到 glibc(或我假设的任何其他 libc)的程序,无论是否从终端运行,其行为都会有所不同。如果您使用shell_exec() 调用它们,它们的行为就像它们在管道中运行但不直接在终端中运行一样。如果程序在终端中运行,则输出通常是行缓冲的。意味着您立即在屏幕上输出/输入的每一行。当程序未在终端中运行时,输出会被缓冲到一个限制(如 4096 字节)...这就是您所遇到的......在 Linux (glibc) 上,您可以使用stdbuf 来调整此缓冲区大小。
【解决方案2】:
<?php
$cmd = "ping www.google.com";

$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;
        flush();
    }
}
echo "</pre>";

Source

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2013-02-22
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多