TUTORIELS 
PHP et les systèmes de caches
(Fourni par Direction|PHP)

Page 1 | 2 | 3 | 4

L'essentiel sur les différents systèmes, et une mise en application du caching avec PEAR/Cache_Lite
 (Janvier 2004)
 
Fonctionnement et mise en place d'une solution de cache côté script
Généralités
Il existe des dizaines, voire des centaines de scripts PHP librement téléchargeables assurant la fonction de gestionnaire de cache. Citons par exemple jpcache (http://www.jpcache.com) et PEAR/Cache (http://pear.php.net/package/Cache).
Comment choisir ? C'est la question que je me suis posé il y a un peu plus d'un an. Je me suis donc imposé un petit cahier des charges. Le gestionnaire de cache côté script devait, à mon sens :
- être atomique : c'est à dire pouvoir être utilisé en tant que sous-module d'un script plus vaste;
- être flexible ;
- être très rapide : de grandes différences de vitesse peuvent apparaît entre différents gestionnaires de cache côté script ;
- être sécurisé contre les corruptions de cache (sur les sites à très fort trafic, les accès en lecture/écriture simultanés peuvent corrompre les fichiers de cache laissant au visiteur une page vide ou incomplète).

* A LIRE Les solutions de caching en PHP4
* Le caching pour accélérer et alléger le réseau
(JDNet Solutions)
Si l'on trouve nombre de classes répondant aux trois premiers points, rares sont celles qui évoquent le dernier. Certaines proposent la technique du verrouillage de fichiers. Cependant cela ne fonctionne pas avec les systèmes de fichiers distribué, comme NFS, ou avec des serveurs web multi-threads, car le verrou est fixé au niveau du processus.
Ne trouvant pas de réelles solutions à mon cahier des charges, je me suis donc lancé dans la réalisation du package idéal: PEAR/Cache_Lite (http://pear.php.net/package/Cache_Lite), publié sous licence libre (GNU/LGPL).

Installation de PEAR/Cache_Lite
PEAR/Cache_Lite est, comme son nom l'indique, une composante du framework PEAR (http://pear.php.net). Par suite, si votre PHP inclut le support PEAR, il est très facile à installer. Sous UNIX, il suffit par exemple de taper la commande :

pear install Cache_Lite

Cependant, dans la mesure où le module devait être atomique et facile à inclure dans un programme plus vaste, il est tout à fait possible d'utiliser PEAR/Cache_Lite sans PEAR. Il suffit de récupérer le fichier PEAR.php d'une installation PEAR quelconque ainsi que le package Cache_Lite dont la dernière version stable est disponible à l'adresse http://pear.php.net/get/Cache_Lite. Il vous suffit ensuite de sélectionner les classes qui vous intéressent, en fonction des utilisations que l'on décrira dans la suite de cet article, et d'intégrer le package dans votre projet. Sans rentrer dans les détails, le seuil point délicat est de gérer correctement l'include_path pour que le fichier PEAR.php soit librement accessible sans besoin de préciser de chemin.

Architecture de PEAR/Cache_Lite
Outre les fichiers d'exemples, les fichiers de tests et les fichiers de benchs, vous trouverez trois classes PHP :
- Lite.php : le noyau du package, qui gère le cache;
- Function.php : permet de cacher des appels de fonction en s'appuyant sur la classe Lite.php ;
- Output.php : permet, en s'appuyant sur la classe Lite.php, de cacher une page entière ou un bloc en utilisant les fonctions d'output buffering de PHP.

Ces classes s'appuient en outre sur le fichier PEAR.php pour la gestion d'erreurs. Mais comme ce dernier fichier est plutôt imposant, l'inclusion est dynamique. C'est à dire que le fichier PEAR.php est chargé uniquement lorsqu'une erreur survient.
D'une façon générale, lorsque vous utilisez un gestionnaire de cache côté script, il faut inclure le minimum de fichiers avant l'appel du cache à proprement parler. Ce genre de script est donc à proscrire :

<?php
require_once('classe1.php');
require_once('classe2.php');
require_once('classe3.php');
require_once('Cache/Lite.php');
SI LA PAGE EST EN CACHE ALORS
  (...)
FIN DU SI
?>

Il faut au contraire opter pour le schéma suivant :

<?php
require_once('Cache/Lite.php');
SI LA PAGE EST EN CACHE ALORS
  require_once('classe1.php');
  require_once('classe2.php');
  require_once('classe3.php');
  (...)
FIN DU SI
?>

Fonctionnement général de PEAR/Cache_Lite
Les différentes classes de Cache_Lite fonctionnent sur le même principe :
- on charge la classe ;
- on crée un objet en passant au constructeur un tableau associatif correspondant aux différentes options disponibles : répertoires, durées de validité, etc...;
- on teste si la page ou le bloc est disponible dans le cache : chaque page ou bloc est identifié par une chaîne de caractères que le programmeur choisi;
- si le cache est valide, on l'affiche ou on le retourne ;
- sinon le reste du script est exécuté et sa sortie mise en cache pour un usage ultérieur.

Les fonctions de contrôle de validité du cache et d'anti-corruption sont complètement transparentes vis-à-vis du programmeur. Si un cache n'est plus valide ou endommagé, tout se passe en effet comme si la page n'était pas cachée. Le script complet est donc exécuté et le résultat stocké pour usage ultérieur.

Forums
* Discutez en sur les forums

Concernant le stockage du cache, différents benchmarks ont été menés. Il apparaît que c'est le stockage sous forme de fichiers qui est le plus rapide, comparé aux stockages dans des bases de données. PEAR/Cache_Lite stocke donc uniquement son cache dans des fichiers, placés dans un répertoire donné. La durée de validité est gérée au niveau de la date système du fichier : c'est l'option la plus rapide pour la relecture. Des clefs de contrôle anti-corruption sont rajoutées au fichier brut en fonction des options choisies.

Page 1 | 2 | 3 | 4

 
[ Fabien MartyDirection|PHP pour JDNet
 
Accueil | Haut de page