Php Echo执行的命令';我们逐行检查结果

Php Echo执行的命令';我们逐行检查结果,php,linux,command,exec,Php,Linux,Command,Exec,我有一个php文件,它使用shell\u exec()在linux上运行命令。这个命令需要一些时间来完成,并在每个阶段打印出一些内容。我希望php在打印时回显命令打印的每一行 我发现使用ob\u flush()和flush(),可以生成这样的分块http响应,但我无法在打印时回显行,因为shell\u exec()会等待命令完成,然后返回输出。这样,当命令同时终止时,所有行都会被回显 我认为我应该避免使用shell\u exec()来达到这种目的。我还可以如何实现这一点?您需要刷新输出缓冲区,以

我有一个php文件,它使用
shell\u exec()
在linux上运行命令。这个命令需要一些时间来完成,并在每个阶段打印出一些内容。我希望php在打印时回显命令打印的每一行

我发现使用
ob\u flush()
flush()
,可以生成这样的分块http响应,但我无法在打印时回显行,因为
shell\u exec()
会等待命令完成,然后返回输出。这样,当命令同时终止时,所有行都会被回显


我认为我应该避免使用
shell\u exec()
来达到这种目的。我还可以如何实现这一点?

您需要刷新输出缓冲区,以便立即将其打印出来:

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

检查OOps的文档。。这个问题读得不够仔细。您已经在使用
flush()
。但是
flush()。。你是否将命令导入另一个命令?你肯定没有仔细阅读这个问题。我编辑它是为了更好地表达我的意思。我希望这是清楚的。在Linux上试试:
shell_exec('stdbuf-o0命令')。请注意,链接到glibc(或我假设的任何其他libc)的程序,如果从终端运行与否,它们的行为会有所不同。如果使用
shell\u exec()
调用它们,它们的行为就像是在管道中运行,而不是直接在终端中运行。如果程序在终端中运行,输出通常是行缓冲的。这意味着您可以立即在屏幕上输入/输出每一行。当一个程序没有在终端上运行时,输出会被缓冲到一个极限(比如4096字节)。。。这就是你正在经历的。。在Linux(glibc)上,您可以使用
stdbuf
来调整此缓冲区大小。使用shell_exec是不可能的,使用proc_openI是可能的。如果您能在回答中告诉我如何做,我将不胜感激。可能重复
<?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>";