Introduction

Introduction – Introduction à Cache_Lite

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);
   }
?>

Conclusion

Pour aller plus loin avec Cache_Lite, regardez les exemples et les détails techniques fournis avec ce paquet.

Cache_Lite (Previous) Constructeur (Next)
Last updated: Sun, 29 Aug 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: joei007 at gmail dot com
Hi, andrea@gianfreda.com

You should remove cache associate with your data update to database.

mysql_query('update blah blah....');
$cache->remove('id_of_content');

or

wait until cache expire.
Note by: andrea@gianfreda.com
Hi,

i would like to ask you how to force the generation of cache files with a trigger: for example, i update a table in a database. A cached content is yet active, but i would like to refresh it. How can i do it with cache_lite?

Thanks,
Andrea