我正在通过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
,然后读取文件。
:)