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>


 
Rédaction JDN Développeurs
 
 
Accueil | Haut de page