OVH Cloud OVH Cloud

Lire un fichier de la fin

4 réponses
Avatar
MOTTE
Hello,

J'ai un fichier log que je fois analyser avec un script PHP. Jusque là r
ien de difficile. Seulement, je dois lire ce fichier depuis la fin. En g
ros, je voudrais pouvoir recupérer les x dernières lignes. Une idée ?

Vincent

--
Vincent MOTTE
www.france-dev.com
Logiciel de gestion d'hebergement, facturation, panel, admin, relances..

4 réponses

Avatar
Guillaume Bouchard
MOTTE wrote:

J'ai un fichier log que je fois analyser avec un script PHP. Jusque là r
ien de difficile. Seulement, je dois lire ce fichier depuis la fin. En g
ros, je voudrais pouvoir recupérer les x dernières lignes. Une idée ?


Ajout les lignes à l'envers, ou ouvre le fichier et positionne toi a la
fin - un nombre de caracteres donnée.


--
Guillaume.

Avatar
P'tit Marcel
MOTTE écrivit:

J'ai un fichier log que je fois analyser avec un script PHP. Jusque là r
ien de difficile. Seulement, je dois lire ce fichier depuis la fin. En g
ros, je voudrais pouvoir recupérer les x dernières lignes. Une idée ?


si ton serveur tourne sous Unix, tail est ton amie.
exec("tail $lefichier",$retour);

avec :

tail [OPTION]... [FILE].. standard input.

Print the last 10 lines of each FILE to standard output.
With more than one FILE, precede each with a header giving
the file name. With no FILE, or when FILE is -, read

-n, --lines=N
output the last N lines, instead of the last 10


eça
--
P'tit Marcel

Avatar
DELPORTE dominique
MOTTE wrote:
J'ai un fichier log que je fois analyser avec un script PHP. Jusque là r
ien de difficile. Seulement, je dois lire ce fichier depuis la fin. En g
ros, je voudrais pouvoir recupérer les x dernières lignes. Une idée ?



Plusieurs solutions existent :
- 1 : tes lignes sont de tailles fixes, alors tu utilises fseek pour te
deplacer de nbre_carac_par_ligne*nber_de_ligne en utilisant l'option
SEEK_END
- 2 : tu recuperes la taille de ton fichier, tu utilises fseek pour
avancer suffisement loin dans le fichier, puis tu utilises fgets
- 3 : tu utilises exec + tail pour recuperer les n dernieres lignes



--
Dominique Delporte

Avatar
Serge

Hello,

J'ai un fichier log que je fois analyser avec un script PHP. Jusque là r
ien de difficile. Seulement, je dois lire ce fichier depuis la fin. En g
ros, je voudrais pouvoir recupérer les x dernières lignes. Une idée ?

Vincent


Tu génères un tableau de la taille du nombre de lignes que tu veux
récupérer, et avec un indice qui s'incrémente (%le nombre de ligne),
tu remplis ton tableau des lignes successives du fichier.
A la fin il ne te reste que les n dernières lignes.

<?PHP {
$n = /*nombre de lignes */;
$i = 0; /* indice */
$ar = array (); /* le tableau */
$fp = fopen ("fichier", "r");
$line = "";

while (($line = fgets ($fp, 2048)) {
$ar[$i++] = $line;
$i%=$n;
}
} ?>

Tu peux aussi essayer avec des array_push et des array_shift, mais je
ne connais pas les performances pour un gros fichier vis-à-vis
d'array_shift, qui d'apprait la doc "déplace tous les éléments vers le
bas après avoir supprimé le premier".
Les avantages sont que si ton fichier fais moins de 10 lignes, tu ne
te retrouves pas avec un tableau plein de cases vides, et que la
plus ancienne des lignes se trouve toujours en début de tableau.

<?PHP {
$n = /*nombr de lignes */;
$ar = array();
$fp = fopen ("fichier", "r");
$line = "";

while (($line = fgets($fp, 2048)) {
if (array_push($ar,$line)>$n) {
array_shift ($ar);
}
}
} ?>

Enfin, si tu te sens à l'aise avec les pointeurs, tu peux appliquer le
même type d'algo avec une liste circulaire de pointeurs (ce qui otera
le défaut d'array_shift).

- Serge -