[Réglé] lire fichier log pendant qu'une application l'écrit

lire fichier log pendant qu'une application l'écrit [Réglé] - PHP - Programmation

Marsh Posté le 17-07-2008 à 11:54:31    

Bonjour, j'ai un programme qui écrit dans un fichier log chaque actions éxécuté de 1 à plus de 10 par secondes.
 
Je veux faire en php un programme qui lis au fur et à mesure les lignes et si il trouve ce que je cherche il executera une action en conséquence.
 
Je n'ai pas commencé j'ai besoin de votre avis pour la meilleur méthode et qui consommera le moins de ressource pour parser.
 
Mon idée une boucle infini:
ouverture log
je lis chaque ligne jusqu'à la fin et entreprend une action si je trouve ce que je cherche.
je note le nombre de ligne
je ferme le fichier
j'attends 1 seconde
 
est-ce que il y a mieux?  
J'ai besoin de fermer et réouvrir pour avoir les nouvelles lignes?
Peut-on limiter la puissance ex ne pas dépasser 10% de processeur?
 
Merci d'avance pour votre aide


Message édité par ouiouioui10 le 24-07-2008 à 12:48:53
Reply

Marsh Posté le 17-07-2008 à 11:54:31   

Reply

Marsh Posté le 17-07-2008 à 11:57:19    

vu ton besoin , est ce qu'il ne serai pas possible d'ecrire dans une base de données plutot ?  
 
ou alors regarde du cote de tail -f sous linux pour ne lire que la fin du fichier


---------------

Reply

Marsh Posté le 17-07-2008 à 12:08:59    

non la base de données est à exclure le programme ne gère que la sortie dans un log
 
pour tail oui et non car le nombres de lignes écrit est variable et comment savoir le nombres de lignes à récuperer?

Reply

Marsh Posté le 18-07-2008 à 23:03:40    

Ba ce que tu peux faire, c'est créer différents fichiers (puisque de toute façon à un moment donné, il te faudra gérer ce cas).
Toutes les minutes, tu log dans un fichier différent. Ton moniteur lui ne va regarder que les nouveaux fichiers (ceux qu'il n'a pas encore traité) puis ensuite concatène ou supprime les logs analysés.

Reply

Marsh Posté le 24-07-2008 à 12:48:16    

j'ai fait comme j'ai dit en haut avec en plus je vais à la fin du log au lancement script sa évite de parser des actions déjà faite:

 
Code :
  1. if (!$log = @fopen($this->loggame, 'r')) {
  2.     $this->status($this->lang['erropen'] . ' "' . $this->loggame . '"');
  3.    } else {
  4.     if ($this->positionfile != 0) fseek($log, $this->positionfile);
  5.     else fseek($log, $this->positionfile, SEEK_END);
  6.     while (!feof($log)) {
  7.      $ligne = fgets($log, 4096);
  8.      if (strpos($this->tempwho, $player) == false) {
  9.       if (si ligne contient un interdit on punit) {
  10.        $this->punish(addslashes($player[1]), 'martyr');
  11.       }
  12.      }
  13.      usleep(15000); //0.015sec 75lignes/sec
  14.     }
  15.     $this->positionfile = ftell($log);
  16.     fclose($log);
  17. }
 

et sa fonctionne sans que sa fasse de pic serveur.
Si quelqu'un a une idée pour améliorer je suis preneur, je rajoute réglé quand même.


Message édité par ouiouioui10 le 24-07-2008 à 12:50:42
Reply

Marsh Posté le 24-07-2008 à 14:16:06    

ya moyen d'interagir sur la sortie dans le log ? Genre rajouter un caractère spécial, qui te servirait de marqueur pour la dernière "session d'écriture" ?


Message édité par NewsletTux le 24-07-2008 à 14:16:23

---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 24-07-2008 à 14:19:40    

le but? Car la j'ai pas compris

Reply

Marsh Posté le 24-07-2008 à 14:23:49    

localiser avec précision la dernière occurence de ce "marqueur" afin de ne pas avoir à se préoccuper du nombre de dernières lignes ajoutées ...


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 24-07-2008 à 14:52:37    

et comment tu localise ce marqueur dans le fichier sans récupérer le contenu? :/

Reply

Marsh Posté le 24-07-2008 à 20:38:30    

Effectivement tu en récupères forcément ...

 

Tiens, regarde dans la fonction fseek le 3eme commentaire en partant du haut :

Citation :

Here's a function I wrote to binary search for a line of text within a file, particularly useful when the file is too large to read into memory at once and you want a faster search than linear.

 

function binary_search_in_file($filename, $search)
[...]


je n'ai pas testé, mais ça a l'air intéressant comme principe. Il y a d'autres contributions qui peuvent donner des idées...


Message édité par NewsletTux le 24-07-2008 à 20:38:46

---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed