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>';
}@@
1 De jcmoriaud -
Oaouh! Je vais essayer ça au plus vite sur mon site, pour lequel je n'arrive pas à faire marcher le cache HTTP de DotClear. Et je te tiendrai au courant.
Il faut mettre un pointeur sur cet article sur le site de dotClear!
Merci, JCMoriaud
2 De Igrecpoint -
Ben, ouaips ...
mouaips ...
on va voir ce qu'on va voir ... des que la RC1 est sortie quand meme ... allez !
Merci Stéphane !
3 De ikow -
Et pour les filles super nulles (moi? oui...) qui pensent que DotClear est un vaccin contre une maladie exotique, t'as rien?
4 De Da Bourz -
Ben ça dépends, que cherches tu ?
5 De Fred -
Oui mais lorsqu'on fait une publication elle peut ne pas apparaitre avant une heure?
6 De Da Bourz -
C'est pas très grave, c'est comme si tu avais posté une heure plus tard non ?
7 De Fed -
Disons que je m'occupe de la plateforme www.mon-blog.org et mes bloggeurs (il y a quand meme 6000 blogs actifs) vont pas comprendre...
Il faudrait que lorsqu'ils font une publication je supprime le cache des pages de leur blog...
Faire en fait un cache non limité dans le temps mais qui est supprimé lorsque la page change (publication, ajout de lien, etc...)
8 De Da Bourz -
Je pense que le mieux que tu puisses faire est d'effacer le fichier de la fonction correspondante dans le dossier cache de la librairie à chaque fois que tu publies un post ou un commentaire. Cette solution permet de ne virer du cache que ce que tu souhaites et qui a vraiment été mis à jour.
Tu penseras à nous donner la recette une fois finie ?
9 De Fed -
J'ai en fait utilisé cette méthode:
www.webrankinfo.com/forum...
qui consiste à génerer des .html pour chaque page du blog, et ensuite je vire quand il le faut les .html qu'il faut remettre à jour, avec donc un cache très long dans le temps (1 an)
10 De Da Bourz -
Oui, j'ai pas utilisé ça parce que avec DotClear rien ne se passe dans le HTML, quand tu es sur la page les requetes et tout et tout sont déjà faites par les fonctions, d'ou cette methode que je préfère.