Manuel Pear
Introduction
Description
PEAR::Cache_Lite est un petit système de cache. ll est optimisé pour les sites web à fort trafic, il est donc vraiment très rapide et sécurisé (car il utilise les verrous de fichiers et/ou des tests anti-corruptions).
Note : une documentation indépendante de Cache_Lite est disponible en chinois sur cette page.
Buts et détails techniques
Vitesse
Avant tout, PEAR::Cache_Lite est destiné à être très rapide. Ce qui rend l'utilisation de PEAR possible sur les sites à fort trafic sans tomber dans des solutions matérielles de hautes technicités.
Vous pouvez trouver plus de détails sur les choix techniques de Cache_lite sur ce document mais l'idée principale est d'inclure le fichier PEAR.php uniquement lorsqu'une erreur survient (extrèmement rare).
Simplicité
Parce que le système de cache est souvent inclus dans la couche applicative, le moteur PEAR::Cache_Lite doit être petit et flexible avec la licence LGPL. Les fonctions avancées peuvent être trouvées dans les fichiers qui étendent le moteur.
Sécurité
Sur les sites web à fort trafic, le système de cache doit être vraiment protégé contre les corruptions de fichiers (à cause des accès concurents en mode lecture/écriture). Vraiment très peu de systèmes de cache offrent une protection contre ce problème.
Un verrou de fichier n'est pas une solution parfaite, car il est inutile avec NFS ou avec des serveurs multitâches. Donc, en plus des verrous de fichiers, PEAR::Cache_Lite offre deux mécanismes totalement transparents (basés sur des clés de hashage) our garantir la sécurité des données en toutes circonstances. Consultez le lien donné dans le paragraphe précédent pour plus de détails.
Utilisation
Utilisation générale
Tous les modules de Cache_Lite suivent la même philosophie.
Les paramètres (autres que ceux par défaut) sont passés au constructeur en utilisant un tableau associatif.
Un fichier en cache est identifié par un identifiant de cache (et éventuellement un groupe). Pour des raisons évidentes de flexibilité, le choix de la logique concernant ces identifiants est laissé à la discrétion du développeur.
Dans ce qui suit, nous utiliserons le terme de "group" pour les fichiers en cache et le terme de "block" pour les pages HTML.
Partie principale
Commençons avec un exemple simple : la page est construite et récupérée avec une variable unique (chaîne de caractères) :
- <?php
- // Inclusion du paquet
- require_once('Cache/Lite.php');
- // Définition d'un identifiant pour ce cache
- $id = '123';
- // Définition de quelques options
- $options = array(
- 'cacheDir' => '/tmp/',
- 'lifeTime' => 3600
- );
- // Création de l'objet Cache_Lite
- $Cache_Lite = new Cache_Lite($options);
- // Test si il y a un cache valide pour cette identifiant
- if ($data = $Cache_Lite->get($id)) {
- // Cache disponible !
- // Le contenu est dans la variable $data
- // (...)
- } else { // Aucun cache valide trouvé (vous devez faire la page)
- // Cache non disponible !
- // Mettez dans la variable $data les données à mettre dans le cache
- // (...)
- $Cache_Lite->save($data);
- }
- ?>
Si vous voulez utiliser un cache par bloc et non un cache global, examinez l'exemple suivant :
- <?php
- require_once('Cache/Lite.php');
- $options = array(
- 'cacheDir' => '/tmp/',
- 'lifeTime' => 3600
- );
- // Création de l'objet Cache_Lite
- $Cache_Lite = new Cache_Lite($options);
- if ($data = $Cache_Lite->get('block1')) {
- echo($data);
- } else {
- $data = 'Données du block 1';
- $Cache_Lite->save($data);
- }
- echo '<br /><br />Ligne non mise en cache !<br /><br />';
- if ($data = $Cache_Lite->get('block2')) {
- echo($data);
- } else {
- $data = 'Données du block 2';
- $Cache_Lite->save($data);
- }
- ?>
Partie principale
Cependant, il n'est pas toujours possible de récupérer tout le contenu d'une page dans une seule variable. Dans ce cas, Cache_Lite_Output vient à votre secours :
- <?php
- require_once('Cache/Lite/Output.php');
- $options = array(
- 'cacheDir' => '/tmp/',
- 'lifeTime' => 10
- );
- $cache = new Cache_Lite_Output($options);
- if (!($cache->start('123'))) {
- // Cache manquant...
- for($i=0;$i<1000;$i++) { // fabrication de la page...
- echo '0123456789';
- }
- $cache->end();
- }
- ?>
L'idée est la même que pour l'utilisation des blocs :
- <?php
- require_once('Cache/Lite/Output.php');
- $options = array(
- 'cacheDir' => '/tmp/',
- 'lifeTime' => 10
- );
- $cache = new Cache_Lite_Output($options);
- if (!($cache->start('block1'))) {
- // Cache manquant...
- echo 'Données du block 1 !';
- $cache->end();
- }
- echo 'Ligne non mise en cache !';
- if (!($cache->start('block2'))) {
- // Cache manquant...
- echo 'Données du block 2 !';
- $cache->end();
- }
- ?>
NOTE IMPORTANTE
Pour une efficacité maximale avec Cache_Lite, n'incluez pas systématiquement tout autre paquet nécessaire à votre page. Chargez UNIQUEMENT les modules dont vous avez besoin lorsque la page n'est pas dans le cache (et doit donc être re-parsée) en utilisant une inclusion conditionnelle.
Le mauvais chemin est :
- <?php
- require_once("Cache/Lite.php");
- require_once("...")
- require_once("...")
- // (...)
- $cache = new Cache_Lite();
- if ($data = $Cache_Lite->get($id)) { // cache trouvé !
- echo($data);
- } else { // la page doit être (re)construite dans $data
- // (...)
- $Cache_Lite->save($data);
- }
- ?>
Voici la meilleure façon (souvent, plus de deux fois plus rapide) :
- <?php
- require_once("Cache/Lite.php");
- // (...)
- $cache = new Cache_Lite();
- if ($data = $Cache_Lite->get($id)) { // cache trouvé !
- echo($data);
- } else { // la page doit être (re)construite dans $data
- require_once("...")
- require_once("...")
- // (...)
- $Cache_Lite->save($data);
- }
- ?>
Remonter 
