2012-02-15 11 views
2

私はファイルmove_uploaded_fileを介してファイルをアップロードしています。そのファイルはjavaプログラムのパラメータとして扱われます。 javaプログラムが実行されている間に、端末の進捗を出力します。 javaプログラムの出力は、同じことをするperlスクリプトの入力です。 私ははshell_exec関数としての私のPHPのWebサイトでそれらのすべてを実行すると、コマンドが正常に実行されているが、JavaやPerlからの出力は私のウェブサイト上に表示されていないリアルタイム出力の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>"; 

シェル画面に印刷しています。私はjavaとperlが実行された後私のコードでページをリフレッシュしようとしたが、それはあまりにもアップロードをリフレッシュします。

出力は現在の出力が

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

おかげ

答えて

4

無効に出力バッファリングob_end_flushを使用して、あなたがファイルディスクリプタを完全に制御を持ってもらうために終了するプロセスを待つ必要はありませんので、shell_execの代わりにproc_openを使用してプロセスを開始します出力。 proc_openを使用してプロセスを開始したときは、STDOUTとSTDERRから読み込み、ブラウザに出力してください。flushと出力され、バッファに保持されません。

+0

私はシステムを使用する代わりに、もしくはshell_exec、それが働きました。 proc_openはシステムに対して何か特別な利点がありますか? – Ank

+0

間違いなく!基本的にプロセスとそのfd(入出力)を完全に制御できます。つまり、コマンドが実行されている間はスクリプトは(proc_openの後に)続行され、多くのメリットが得られます。 – mvds

-1

あるように私はPHPを書く必要がありますどのように

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

では> file.txtその後、読み取りファイルを試してみてください。

:)

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

私は実際には、リアルタイムでシェルコマンドを表示していないurコードを試してみましたが、すべてのテキストをロードし、sleep(1)ヘルプを使用してビットごとに表示を終了するシェルコマンドを待ちます。 申し訳ありませんが、あなたはdownvoteに値する –

関連する問題