2011-12-03 19 views
5

Mam ten program powłoki, który chcę wykonać przez php. Problem polega na tym, że może to zająć dużo czasu, a ja potrzebuję go do aktualizacji w czasie rzeczywistym do przeglądarki użytkownika.php shell_exec z aktualizacją w czasie rzeczywistym

Przeczytałem, że mogę potrzebować użyć popen(), aby to zrobić, ale jestem w pewnym sensie (ok, naprawdę jestem: P) noob PHP i nie mogę wymyślić, jak mogę to zrobić .

Doceniam każdą pomoc!

Odpowiedz

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

Dzięki za szybką i doskonałą odpowiedź, kolego! – MegaEduX

+1

Dlaczego musisz opróżnić bufor? – dellsala

2

możliwe są dwa problemy:

  1. dla bloku, gdzie trzeba zrobić coś innego między flushs (@GameBit pokazać jak to zrobić).

  2. z blokiem, gdzie czekać aż zwanego wykończenia polecenia w tym przypadku wyglądać passthru function

+0

Jak bym to zrobił z passthru? Czy jest jakaś wada korzystania z kodu @ GameBit, jeśli nie muszę nic robić pomiędzy opróżnieniami? – MegaEduX

+0

Przekazujesz tę samą komendę, co w rozwiązaniu z popen, ale wyjście z zewnętrznego programu przechodzi bezpośrednio na wyjście ... Jeśli znasz różnicę między fopen i readfile, jest praktycznie to samo, tylko z procesami. Najpierw pozwól czytać bajt po bajcie i wstawić do zmiennej, przetwarzaj dane, inny prosty odczyt i zapis na wyjściu bezpośrednio, bez żadnego działania. –

+0

Mam to. Właściwie jest łatwiejszy w użyciu. Obrigado! :RE – MegaEduX

-1

spróbuj tego kodu (testowane na maszynie Windows + serwer 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(); 
1

istnieje brudna prosta opcja

`yourcommand 1>&2`; 

przekierowanie standardowe wyjście e stderr.

Powiązane problemy