2010-07-10 6 views

risposta

21

devi ciclo con il sonno:

$file='/home/user/youfile.txt'; 
$lastpos = 0; 
while (true) { 
    usleep(300000); //0.3 s 
    clearstatcache(false, $file); 
    $len = filesize($file); 
    if ($len < $lastpos) { 
     //file deleted or reset 
     $lastpos = $len; 
    } 
    elseif ($len > $lastpos) { 
     $f = fopen($file, "rb"); 
     if ($f === false) 
      die(); 
     fseek($f, $lastpos); 
     while (!feof($f)) { 
      $buffer = fread($f, 4096); 
      echo $buffer; 
      flush(); 
     } 
     $lastpos = ftell($f); 
     fclose($f); 
    } 
} 

(testato .. funziona)

+0

La pagina non viene caricata ... sembra che sia bloccata in un ciclo di risposta – HyderA

+3

@gAMBOOKa Prova ad aggiungere un flush dopo l'eco. E sì, è in un ciclo infinito. Non è questo il punto? – Artefacto

-1

Solo un'idea ..

ne pensi tramite il comando * nix coda? eseguire il comando da php (con un parametro che restituirà un certo numero di righe) ed elaborare i risultati nel tuo script php.

+0

Non si è mai sicuri di quante righe vengono scritte tra le chiamate :) – bisko

0

è possibile chiudere l'handle del file quando non viene utilizzato (una volta che una parte dei dati è stata scritta). oppure puoi usare un buffer per memorizzare i dati e metterli nel file solo quando è pieno. in questo modo non avrai il file aperto tutto il tempo.

se si desidera ottenere tutto ciò che è scritto sul file non appena viene scritto lì, potrebbe essere necessario estendere il codice, scrivendo i dati, in modo che venga emesso anche in altri posti (schermo, alcune variabili , altro file ...)

0

ad esempio:

$log_file = '/tmp/test/log_file.log'; 

$f = fopen($log_file, 'a+'); 
$fr = fopen($log_file, 'r'); 

for ($i = 1; $i < 10; $i++) 
{ 
    fprintf($f, "Line: %u\n", $i); 
    sleep(2); 
    echo fread($fr, 1024) . "\n"; 
} 

fclose($fr); 
fclose($f); 

//Or if you want use tail 

$f = fopen($log_file, 'a+'); 

for ($i = 1; $i < 10; $i++) 
{ 
    fprintf($f, "Line: %u\n", $i); 
    sleep(2); 
    $result = array(); 
    exec('tail -n 1 ' . $log_file, $result); 
    echo "\n".$result[0]; 
} 

fclose($f); 
Problemi correlati