|
|
PRATIQUE PHP |
|
|
|
Cibler des lignes de texte en PHP |
|
"Je voudrais, à partir du fichier log de mon site, n'avoir que les informations concernant un seul fichier. Comment m'y prendre rapidement, quand le fichier log fait plusieurs centaines de milliers de lignes ?"
(20/01/2006) |
|
|
Forum |
|
Réagissez
dans les forums
de JDN Développeurs
|
Les fichiers logs, ou journaux d'activités, des serveurs Apache,
incrémentés à chaque requête sur un fichier d'un site Web, peuvent
rapidement prendre une place impressionnante.
Pour une page présentant 5 images et un fichier CSS, cela fait
déjà 7 lignes qui s'ajoutent au journal de la journée en cours.
Un tel fichier se remplit donc très vite pour peu qu'il ait
un nombre même petit de visiteurs. De plus, leur traitement
pour en tirer des statistiques se fait donc généralement la
nuit, là où la charge du serveur est sensée être la moins importante.
Ces journaux
peuvent cependant être téléchargés à part, pour leur appliquer
un traitement autre que celui de l'outil interne de statistique.
On pourra vouloir suivre le parcours d'une adresse IP donnée,
chercher le nombre de fois où un fichier a été chargé, ou plus
simplement savoir qui était sur le site à telle heure.
Une ligne typique d'un tel fichier est de cette forme :
81.49.205.26 - lapin [18/Jan/2006:12:17:41
+0100] "GET /blog/style.css HTTP/1.0" 200 9624 "http://www.example.com/"
"Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8) Gecko/20051111
Firefox/1.5"
On y retrouve, entre autres, l'adresse IP du visiteur, l'horodatage
de la requête, la méthode de requête (GET),
le fichier demandé, le protocole utilisé, la réponse du serveur
(ici, 200), la taille du fichier en octets (ici, 9 624),
l'URL de provenance du visiteur, et les spécifications de son
visiteur.
Cependant, on ne peut pas traiter de tels fichiers de manière
brutale : ils peuvent peser plusieurs centaines de méga-octets
pour les grands sites, et la mémoire requise pour un tel traitement
serait dérisoire. Il faut alors traiter le fichier ligne à ligne.
Voici donc un programme PHP très simple, qui affichera
uniquement les lignes comportant le motif recherché, en donnant
leur nombre en fin de page. Il utilise la fonction fgets(),
qui renvoie par défaut la ligne courante du fichier ouvert.
On fait également appel aux expressions régulières
pour trouver la correspondance.
<pre>
<?php
$fichier = "server_log.txt";
$s = "callingyou.mp3";
$motif = "/$s/";
$pointeur = fopen($fichier, "r");
$i = 0;
if ($pointeur) {
while (!feof($pointeur)) {
$ligne = fgets($pointeur);
if (preg_match($motif, $ligne, $r))
{
echo $ligne.'';
$i++;
}
}
fclose($pointeur);
echo "Motif '$s' trouvé $i fois.";
}
?>
</pre>
|
|
|