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