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 dans
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);
}
?>
Conclusion
Pour aller plus loin avec Cache_Lite, regardez les exemples et les détails
techniques fournis avec ce paquet.