我通过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
由于
答案 0 :(得分:4)
使用ob_end_flush
禁用输出缓冲,并使用proc_open
而不是shell_exec
启动进程,这样您就可以完全控制文件描述符,而无需等待进程完成输出。当您使用proc_open
启动该过程时,请从其STDOUT和STDERR读取并将其输出到浏览器,可能使用flush
以确保您的输出不会保留在任何缓冲区中。
答案 1 :(得分:2)
这是我的解决方案:(在Windows机器+ wamp服务器上测试)
header('Content-Encoding: none;');
set_time_limit(0);
$handle = popen("<<< Your Shell Command >>>", "r");
if (ob_get_level() == 0)
ob_start();
while(!feof($handle)) {
$buffer = fgets($handle);
$buffer = trim(htmlspecialchars($buffer));
echo $buffer . "<br />";
echo str_pad('', 4096);
ob_flush();
flush();
sleep(1);
}
pclose($handle);
ob_end_flush();
答案 2 :(得分:-1)
尝试> file.txt
然后读取文件。
:)