TUTORIELS 

Cas pratique : un moteur de recherche en Php.
Troisième partie : Indexation récursive, origine des mots
Dans ce troisième volet de notre "moteur de recherche", nous améliorons l'indexation par un algorithme de parcours récursif des fichiers, et nous implémentons l'origine du mot traité dans notre table.  (25 janvier 2002)
 

Pages 1 | 2

Lors du dernier épisode, nous avions renseigné le champ "titre" de la table moteur et conçu une "interface" capable de parcourir notre disque dur à la recherche d'un fichier à indexer.

Nous allons modifier cette interface aujourd'hui afin de la rendre automatique et récursive. Après cette transformation il ne vous sera plus possible (dans l'état actuel du script) de choisir un fichier à indexer.
Cette situation est susceptible d'évoluer lorsque nous évoquerons les améliorations possibles à apporter à notre code.

Pas de panique si vous souhaitez conserver "l'interface précédente", son code était fourni en fin du tutoriel précédent.

Notre but aujourd'hui est d'une part de pouvoir lancer une indexation automatique et récursive de nos fichiers et d'autre part de renseigner le champ "origine", destiné à localiser chaque mot dans l'arborescence.


Les modifications à effectuer à notre script

Afin que l'indexation récursive fonctionne, notre script (renommé "moteur.php" au lieu de "find_title.php") doit être placé au "point de départ" de la récursivité souhaité. Notre jeu de tests (fourni en fin de tutoriel) pour cette indexation récursive est constitué de cinq fichiers HTML issus de tutoriels précédents, ils sont placés de la sorte :

- ...\EasyPHP\www\projet1\moteur\chaines_python.html
- ...\EasyPHP\www\projet1\moteur\exceptions_java.html
- ...\EasyPHP\www\projet1\moteur\rep1\chgt_registar.html
- ...\EasyPHP\www\projet1\moteur\rep2\flash_dyn_php.html
- ...\EasyPHP\www\projet1\moteur\rep2\selec_flash.html

Il faut donc placer notre script "moteur.php" au niveau le plus haut de notre arborescence :

- ...\EasyPHP\www\projet1\moteur\moteur.php

Le script de notre moteur va devoir subir quelques modifications, nous allons les voir ensemble.
Il va s'agir tout d'abord de concevoir (ou de trouver sur le net) une fonction qui liste récursivement le contenu de notre arborescence. Grâce à la documentation en ligne du site Php.net et plus précisemment aux commentaires ajoutés par des internautes au sujet de la fonction readdir() , nous récupérons une fonction nommé "echo_dir()" qui affiche récursivement le contenu d'une arborescence.

Afficher le nom des fichiers de notre jeu d'essai ne nous intéresse pas vraiment, aussi nous allons modifier cette fonction jusqu'à ce qu'elle devienne le squelette, la boucle principale de notre indexation, la voici modifiée :

function echo_dir($where)
{
     $handle = opendir('.');
     while ($file = readdir($handle))
     {
          if ($file != "." && $file != "..")
          {
               if (is_dir($file))
               {
                    chdir($file);
                    $tmp = $where."/".$file;
                    echo_dir($tmp);
                    chdir("../");
               }
          else
          {
               if (($where != "") && ereg(".html",$file))
               {
                    echo ("$where/$file<br>");
                    $src = $where."/".$file;
                    indexation($file, $src);
               }
               elseif (ereg(".html",$file))
               {
                    echo ("/$file<br>");
                    $src = "/".$file;
                    indexation($file, $src);
              }
          }
     }
}
     closedir($handle);
}

echo_dir("");

Beaucoup de points à préciser ici... Procédons par ordre :
Nous lançons tout d'abord cette fonction avec le paramètre "" afin qu'elle démarre son traitement à la racine de l'arborescence.
Nous récupérons un pointeur sur le répertoire courant grâce à la fonction opendir().

La plupart des fonctions Php utilisées ici sont issues des fonctions "d'accès aux dossiers". Avec la boucle while nous nous assurons de traiter tous les fichiers du dossier courant, en effet, la boucle se poursuit tant que la fonction readdir() ne renvoie pas "false". En tant normal celle-ci renvoie le nom des entrées du répertoire.

Si les entrées renvoyées par readdir() n'est pas celle désignant le répertoire précédent ("..") ni celle du répertoire courant ("."), alors il est intéressant de la traiter.

La fonction "is_dir()" porte bien son nom, elle permet de vérifier si l'entrée traitée est un répertoire, auquel cas la récursivité rentre en jeu. Lorsqu'un répertoire est détecté, la fonction "chdir()" est utilisée afin de passer du répertoire courant au nouveau répertoire.
La variable $tmp permet de concaténer le répertoire courant avec la nouvelle entrée, ainsi l'arborescence se construit.

Si l'entrée traitée n'est pas un répertoire, c'est un fichier mais faut-il l'afficher, et si oui comment ? Le "else" traite deux cas :
- Le cas d'un fichier à indexer depuis la racine de l'arborescence
- Le cas d'un fichier à indexer depuis un répertoire.

Ces deux cas se matérialisent par les "echo", respectivement :

- echo ("$where/$file<br>");
- echo ("/$file<br>");

Ils représentent l'origine du fichier. Voilà ce que nous obtiendrons à l'écran après l'indexation de notre jeu d'essai :

/chaines_python.html
/exceptions_java.html
/rep2/selec_flash.html
/rep2/flash_dyn_php.html
/rep1/chgt_registar.html

La question "faut-il afficher / traiter" ce fichier est résolue par l'utilisation de la ligne suivante :

ereg(".html",$file)


Nous avons déjà utilisé précedemment cette fonction, elle permet de détecter si un fichier possède l'extension qui nous intéresse, ici ".html".

Pour résumer, la fonction echo_dir() nous permet de boucler récursivement autour des fichiers qui nous intéressent dans notre arborescence. Judicieusement placées, les lignes...

indexation($file, $src);


... Vont déclencher le processus d'indexation pour chacun des fichiers.

Pages 1 | 2

 
[ Arnaud GadalJDNet
 
Accueil | Haut de page