在php中运行带有实时输出的shell命令


running shell command in php with realtime output

我正在通过php move_uploaded_file函数上传一个文件,然后将该文件作为java程序的参数。当java程序正在执行时,它在终端中输出进度。java程序的输出是执行相同操作的perl脚本的输入。我正在我的php网站上执行所有的shell_exec函数,并将它们打印在屏幕上

    echo "Running java ..... ";
    $output=shell_exec("java -jar abc.jar ".( $_FILES['uploaded']['name']));
    echo "<pre>$output</pre>";
    echo "running perl .....";
    $output=shell_exec("perl abc.pl outputfromjava.txt");
    echo "<pre>$output</pre>";

shell命令运行良好,但java和perl的输出没有显示在我的网站上。在执行java和perl之后,我尝试刷新代码中的页面,但随后它也刷新了上传。

输出现在是

Running java ....
Running Perl ....

我应该如何编写php以使输出为

Running Java...
Progress1 //from java output
progress2 //from java output
Running Perl....
Progress1 //from perl output
progress2 //from perl output

感谢

使用ob_end_flush禁用输出缓冲,并使用proc_open而不是shell_exec启动进程,这样您就可以完全控制文件描述符,不需要等待进程完成才能获得输出。当您使用proc_open启动进程时,从它的STDOUT和STDERR中读取并将其输出到浏览器,可能使用flush来确保您的输出不保留在任何缓冲区中。

这是我的解决方案:(在Windows机器+wamp服务器上测试)

header('Content-Encoding: none;');
set_time_limit(0);
if (ob_get_level() == 0) {
    ob_start();
}
$handle = popen("<<< Your Shell Command >>>", "r");
while(!feof($handle)) {
    $buffer = trim(htmlspecialchars(fgets($handle)));
    echo $buffer . "<br />" . str_pad('', 4096);    
    ob_flush();
    flush();
    sleep(1);
}
pclose($handle);
ob_end_flush();

尝试> file.txt,然后读取文件。

:)