2011-12-03 9 views
5

Ho questo programma shell che voglio eseguire da php. Il problema è che può richiedere molto tempo e, a tale scopo, ho bisogno di aggiornare in tempo reale il browser dell'utente.php shell_exec con aggiornamento in tempo reale

Ho letto che potrei aver bisogno di usare popen() per farlo, ma sono un po '(ok, sono davvero: P) un noob PHP e non riesco a capire come potrei riuscire a farlo .

Apprezzerei qualsiasi aiuto!

risposta

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

Grazie per la risposta veloce ed eccellente, amico! – MegaEduX

+1

Perché si deve svuotare il buffer? – dellsala

2

ci sono due possibili comportamenti:

  1. non Block, in cui è necessario fare qualcosa di diverso tra flushs (@GameBit mostrare come farlo).

  2. Con Block, dove si attende fino a quando la chiamata finitura di comando, in questo caso sembrano passthru function

+0

Come faccio con passthru? Inoltre, c'è qualche svantaggio nell'usare il codice di @ GameBit se non ho bisogno di fare nulla tra i flush? – MegaEduX

+0

Si passa lo stesso comando della soluzione con popen, ma l'output del programma esterno passa direttamente all'output ... Se si conosce la differenza tra fopen e readfile, è praticamente la stessa cosa, solo con i processi. Innanzitutto consenti di leggere byte per byte e di inserirli in una variabile, elaborare i dati, un'altra semplice lettura e scrittura in output direttamente, senza alcuna azione. –

+0

Capito. In realtà è più facile da usare. Obrigado! : D – MegaEduX

-1

provare questo codice (testato su Windows macchina + server di 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

c'è una sporca scelta facile

`yourcommand 1>&2`; 

reindirizzare lo stdout th e stderr.