在php中运行shell命令并实时输出

gmxoilav  于 2023-06-20  发布在  PHP
关注(0)|答案(3)|浏览(172)

我通过php move_uploaded_file函数上传一个文件,然后该文件作为java程序的参数。当java程序执行时,它在终端中输出进度。java程序的输出是perl脚本的输入,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

谢谢

brgchamk

brgchamk1#

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

zbsbpyhn

zbsbpyhn2#

这是我的解决方案:(在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();
h4cxqtbf

h4cxqtbf3#

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

相关问题