2011-12-03 49 views
5

我有這個shell程序,我想執行的PHP。問題是它可能需要很長時間,因此我需要它實時更新到用戶的瀏覽器。我讀過,我可能需要使用popen()來做到這一點,但我有點(好吧,我真的是:P)一個PHP noob,不知道我怎麼能做到這一點。php shell_exec與實時更新

將不勝感激任何幫助!

回答

13
if(($fp = popen("your command", "r"))) { 
    while(!feof($fp)){ 
     echo fread($fp, 1024); 
     flush(); // you have to flush buffer 
    } 
    fclose($fp); 
} 
+0

感謝您的快速和優秀的答案,隊友! – MegaEduX

+1

爲什麼你需要刷新緩衝區? – dellsala

2

有兩種可能的行爲:

  1. 無座,在那裏你需要做的flushs之間其他的東西(@GameBit展示如何做到這一點)。

  2. 帶座外,在那裏你等到叫命令完成,在這種情況下看passthru function

+0

我該怎麼做passthru?另外,如果我不需要在刷新之間進行任何操作,是否有使用@GameBit代碼的缺點? – MegaEduX

+0

您可以像使用popen一樣在解決方案中傳遞相同的命令,但外部程序的輸出會直接輸出到輸出中。如果知道fopen和readfile之間的區別,實際上只是與進程相同。首先允許你逐字節讀取並放入一個變量,處理數據,另一個簡單的讀寫直接輸出,無需任何操作。 –

+0

明白了。其實更容易使用。 Obrigado! :d – MegaEduX

-1

試試這個代碼

 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(); 
1

有(Windows機器+ WAMP的服務器上測試)一個骯髒的簡單選項

`yourcommand 1>&2`; 

將stdout重定向到th e stderr。