Bien sur, pas question d'écrire un système de cache, l'avantage de l'Open Source est de pouvoir utiliser des librairies déjà faites, et avec talent la plupart du temps. Donc après un petit tour sur PEAR, l'archive online d'extension et d'application libre PHP, je trouve Cache_Lite, qui pour ne rien gacher est developpé par un Français : Fabien MARTY.

Cache_Lite est exactement ce qu'il nous faut, simple à utiliser et surtout il dispose d'un cache de fonction PHP. En effet, pour que notre cache soit efficace, avec DotClear il faut cacher les fonctions d'appel à la base et non le rendu HTML, explications ci-dessous :

D'abord, procurez vous Cache_lite, et installez le sur votre serveur, voilà ce que je vous conseille : Créez un dossier 'cache' à la racine de votre site, c'est dans se dossier que seront stockés les fichiers générés par le cache. Ensuite créez un dossier 'include', toujours à la racine de votre site, et faites en sorte qu'il soit dans le 'include_path' de PHP, de cette façon vous n'aurrez pas à faire figurer le chemin complet des fichiers que nous allons y placer. Ensuite Créer un dossier 'Cache' dans 'include' (il faut mieux commncer à ranger dès maintenant le contenu !) décompressez et placez dans le dossier créé le fichier 'Lite.php' et le répertoire 'Lite'.

Cela donne :

@@/
/cache
/include/Cache/Lite.php
/include/Cache/Lite/Function.php
/include/Cache/Lite/Output.php@@

Vous pouvez ensuite modifier les différents paramètres de la configuration de Cache_Lite dans le fichier Lite.php. Se sont les paramêtres par défaut, mais ne vous inquiétez pas, vous allez pouvoir les préciser et les modifier lors de chaque inclusion, dans la page PHP ou vous ferez appel au cache.

Donc, dans le fichier Prepend, il faut ajouter au debut :

@@// Ajout du cache
require_once('Cache/Lite/Function.php');
$options = array(
'cacheDir' => $DOCUMENT_ROOT.'cache/',
'lifeTime' => 3600
);
$cache = new Cache_Lite_Function($options);
// Fin ajout du cache@@

C'est l'import du cache pour les "fonctions", puis la définition de son repertoire de stockage (les résultats sont stockés sous forme de fichiers) et le temps de vie du cache, ici une heure.

Ensuite, toujours dans le fichier Prepend, il faut remplacer chaque appel de fonction "DotClear" par son appel mais en utilisant la fonction "Cache". Par exemple pour l'appel des catégories, vous allez trouver la ligne suivante :

$rs_cat = $blog->getCat();

Et il faut la remplacer par :

$rs_cat = $cache->call('blog->getCat');

Vous trouverez donc ci dessous, l'intégralité des modifications à faire (si vous le souhaitez) dans la page Prepend pour mettre le cache en route pour presque tout, à chaque modification j'ai ajouté un commentaire "Ajout Cache", commenté la ligne originale de DotClear faite par Olivier et mis juste au dessus la ligne avec la fonction qui fait appel au cache.

Mais Argh, qu'est-ce que je vois, la version finale de Dotclear arrive et tout à été réécrit ? Merdouille, ce système de cache ne marchera peut être plus ? Bon c'est pas grave, je le mettrais à jour si besoin est.

Bon allez, voici le code, qui, petite précision, met en cache la page d'accueil, pas la page d'un billet (pour les commentaires), amusez vous bien :

@@$head_links = array();

// Catégories
// Ajout cache
$rs_cat = $cache->call('blog->getCat');
//$rs_cat = $blog->getCat();


// Mois pour les archives
// Ajout cache
$arry_months = $cache->call('blog->getAllDates','m',,,'',$cat_id);
//$arry_months = $blog->getAllDates('m',,,'',$cat_id);


if (!empty($_GET'q')) {
$mode = 'search';
}


if($mode == 'home' || $mode == 'cat' && $cat_id || $mode == 'year')
{
// Dernières nouvelles
// Ajout cache
$news =
$cache->call('blog->getLastNews',$cf_nb_post_per_page,$cat_id,'DESC');
//$news = $blog->getLastNews($cf_nb_post_per_page,$cat_id,'DESC');
if ($news->isEmpty()) {
$err_msg = '<p>Aucun billet.</p>';
}

// Ajout cache
$head_links .= $cache->call('news->getHeadLinks');
//$head_links .= $news->getHeadLinks();
}

elseif($mode == 'day')
{
// Ajout cache
$news =
$cache->call('blog->getPostByDate',$year,$month,$day,$cat_id,'DESC');
//$news = $blog->getPostByDate($year,$month,$day,$cat_id,'DESC');
if ($news->isEmpty()) {
$err_msg = '<p>Aucun billet.</p>';
}
}

elseif($mode == 'month')

{
// Ajout cache
$news = $cache->call('blog->getPostByDate',$year,$month,'',$cat_id,'DESC');
//$news = $blog->getPostByDate($year,$month,'',$cat_id,'DESC');
if ($news->isEmpty()) {
$err_msg = '<p>Aucun billet.</p>';
}@@