2010-07-10 17 views

Respuesta

21

Necesitas bucle con el sueño:

$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); 
    } 
} 

(probado .. funciona)

+0

La página no se carga ... parece que está atascada en un ciclo de infite – HyderA

+3

@gAMBOOKa Intente agregar un color después del eco. Y sí, está en un ciclo infinito. ¿No es ese el punto? – Artefacto

-1

Sólo una idea ..

Qué le pareció usando el comando * nix cola? ejecuta el comando desde php (con un param que devolverá una cierta cantidad de líneas) y procesa los resultados en tu script php.

+0

Nunca puede estar seguro de cuántas líneas se escriben entre las llamadas :) – bisko

0

puede cerrar el identificador del archivo cuando no se utiliza (una vez que se ha escrito una parte de los datos). o puede usar un buffer para almacenar los datos y ponerlos en el archivo solo cuando esté lleno. de esta manera, no tendrás el archivo abierto todo el tiempo.

si desea obtener todo lo que está escrito en el archivo tan pronto como está escrito allí, es posible que necesite extender el código, escribir los datos, para que también salga a otros lugares (pantalla, alguna variable , otro archivo ...)

0

Por ejemplo:

$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); 
Cuestiones relacionadas