2012-02-15 48 views
2

我通过php move_uploaded_file函数上传文件,然后将该文件作为java程序的参数。当java程序正在执行时,它会输出终端中的进度。 java程序的输出是一个perl脚本的输入,它执行相同的操作。 我执行所有的人都在我的PHP网站作为了shell_exec功能和打印他们在屏幕上在php中运行shell命令实时输出

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 

感谢

回答

4

禁止输出缓冲使用ob_end_flush,并使用proc_open代替shell_exec启动过程中,所以你必须在文件描述符完全控制,不需要等待过程来完成,以获得输出。当您使用proc_open启动进程时,从其STDOUT和STDERR读取并输出到浏览器,可能使用flush以确保您的输出不保存在任何缓冲区中。

+0

我使用的系统代替了shell_exec和它的工作(Windows机器+ WAMP的服务器上测试)。 proc_open是否比系统有更多优势? – Ank 2012-02-16 21:04:00

+0

绝对!你基本上可以完全控制过程和它的fd(输入/输出)。也就是说,当命令运行时,脚本会继续(在'proc_open'后面),从而带来很多潜在的好处。 – mvds 2012-02-16 21:56:51

-1

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

:)

2

这是我的解决方案:

 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(); 
+0

我已经尝试过ur代码,实际上它并没有实时显示shell命令,只是等待shell命令完成加载所有文本并使用sleep(1)帮助一点一点地显示它。 对不起,你值得低调 – 2016-06-28 08:11:55