2010-07-10 9 views
9

Je souhaite lire un fichier journal en cours d'écriture. Il réside sur le même serveur que l'application. La capture est le fichier est écrit à toutes les quelques secondes, et je veux essentiellement tail le fichier sur l'application en temps réel.PHP: Comment lire un fichier en cours d'écriture permanente

Est-ce possible?

Répondre

21

Vous devez boucle avec le sommeil:

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

(testé .. il fonctionne)

+0

La page ne se charge pas ... le regarde coincé dans une boucle infite – HyderA

+3

@gAMBOOKa Essayez d'ajouter une couleur après l'écho. Et oui, c'est dans une boucle infinie. N'est-ce pas le but? – Artefacto

-1

Juste une idée ..

Avez-vous pensé à l'aide de la commande * nix queue? exécutez la commande à partir de php (avec un param qui retournera un certain nombre de lignes) et traitez les résultats dans votre script php.

+0

Vous ne pouvez jamais savoir exactement combien de lignes sont écrites entre les appels :) – bisko

0

Vous pouvez fermer la poignée de fichier lorsqu'elle n'est pas utilisée (une fois qu'une partie des données a été écrite). ou vous pouvez utiliser un tampon pour stocker les données et les mettre dans le fichier uniquement lorsqu'il est plein. De cette façon, vous n'aurez pas le fichier ouvert tout le temps. Si vous voulez obtenir tout ce qui est écrit dans le fichier dès qu'il y est écrit, il vous faudra peut-être étendre le code, en écrivant les données, pour qu'elles soient également envoyées à d'autres endroits (écran, variable, etc.). , un autre fichier ...)

0

par exemple:

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