2009-07-09 21 views

risposta

24

Io non credo che ci sia un modo magico per farlo. Devi solo eseguire il polling continuo delle dimensioni del file e generare nuovi dati. Questo è in realtà abbastanza semplice, e l'unica cosa reale a cui prestare attenzione è che le dimensioni dei file e gli altri dati delle statistiche sono memorizzati nella cache di PHP. La soluzione a questo è chiamare clearstatcache() prima di emettere qualsiasi dato.

Ecco un rapido esempio, che non include la gestione degli errori:

function follow($file) 
{ 
    $size = 0; 
    while (true) { 
     clearstatcache(); 
     $currentSize = filesize($file); 
     if ($size == $currentSize) { 
      usleep(100); 
      continue; 
     } 

     $fh = fopen($file, "r"); 
     fseek($fh, $size); 

     while ($d = fgets($fh)) { 
      echo $d; 
     } 

     fclose($fh); 
     $size = $currentSize; 
    } 
} 

follow("file.txt"); 
+0

Ciao, La soluzione sembra essere la masterizzazione di un sacco di CPU (+ -40% sulla mia configurazione di prova). Ci sono indicazioni su un modo più efficiente di guardare le cartelle? – Coyote

+1

'usleep (100)' sta dormendo per 100 milionesimi di secondo o 0.0001 secondi. Aumentalo a 'usleep (10000)' (0.01s) per un utilizzo inferiore della CPU, a meno che tu non abbia bisogno di una latenza estremamente bassa. 'usleep (2000000)' o 'sleep (2)' (2s) per qualcosa che vuoi essere ragionevolmente fresco quando lo guardi. – ReactiveRaven

+0

Ho provato questo codice, ma non ha avuto successo ... il browser continua a caricare ... e non riecheggia .. – ihtus

2
$handler = fopen('somefile.txt', 'r'); 

// move you at the end of file 
fseek($handler, filesize()); 
// move you at the begining of file 
fseek($handler, 0); 

E probabilmente si vuole prendere in considerazione l'uso di stream_get_line

2

Invece di polling spazio si regolare controllando il file ora di modifica: filemtime

+3

Entrambi richiedono una chiamata a stat() sotto la superficie, quindi non importa. –

5

Checkout php-tail on Google code. Si tratta di un'implementazione di 2 file con PHP e Javascript e ha un sovraccarico molto piccolo nei miei test.

Supporta anche il filtraggio con una parola chiave grep (utile per ffmpeg che emette frame rate ecc. Ogni secondo).

11
$handle = popen("tail -f /var/log/your_file.log 2>&1", 'r'); 
while(!feof($handle)) { 
    $buffer = fgets($handle); 
    echo "$buffer\n"; 
    flush(); 
} 
pclose($handle); 
+0

Arresta il server Apache. Fai questo solo per me? – dctremblay

+0

Controlla i log degli errori per trovare indizi, ma questo non dovrebbe rovinare il tuo processo di apache. –

0

Di seguito è ciò che ho adattato dall'alto. Chiamalo periodicamente con una chiamata ajax e aggiungi al tuo 'titolare' (area di testo) ... Spero che questo aiuti ... grazie a tutti voi che contribuite allo stackoverflow e ad altri forum di questo tipo!

/* Used by the programming module to output debug.txt */ 
session_start(); 
$_SESSION['tailSize'] = filesize("./debugLog.txt"); 
if($_SESSION['tailPrevSize'] == '' || $_SESSION['tailPrevSize'] > $_SESSION['tailSize']) 
{ 
     $_SESSION['tailPrevSize'] = $_SESSION['tailSize']; 
} 
$tailDiff = $_SESSION['tailSize'] - $_SESSION['tailPrevSize']; 
$_SESSION['tailPrevSize'] = $_SESSION['tailSize']; 

/* Include your own security checks (valid user, etc) if required here */ 

if(!$valid_user) { 
    echo "Invalid system mode for this page."; 
} 
$handle = popen("tail -c ".$tailDiff." ./debugLog.txt 2>&1", 'r'); 
while(!feof($handle)) { 
    $buffer = fgets($handle); 
    echo "$buffer"; 
    flush(); 
} 
pclose($handle);