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).
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.
|
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
|