Mise en place d'un cache APC dans Dotclear2
Par Ludovic Toinel le samedi 22 décembre 2007, 14:14 - DotClear - Lien permanent

Vous connaissez très certainement APC, APC est un cache mémoire pour PHP :
http://pecl.php.net/package/APC
APC permet de stoker des données en mémoire et de pouvoir les récupérer rapidement. C'est un endroit de stockage persistant, rapide d'accès, avec une gestion automatique de la durée de vie des données stockées.
Voici les modifications que j'ai réalisées sur Dotclear2 pour cacher l'ensemble des pages compilées. Ces modifications permettent à Dotclear d'éviter de régénérées les pages à chaque demande, cela permet donc d'économiser du CPU au niveau de l'interpréteur PHP et surtout au niveau de la base de données.
Pour profiter de cette modification, il faut bien entendu avoir installé et activé APC sur votre serveur Web.
1) Editer le fichier "/inc/public/lib.urlhandlers.php"
2) Cherchez la fonction "serveDocument" (aux environs de la ligne 47).
3) Chercher la ligne :
$out = $core->tpl->getData($tpl);
4) Remplacez la par :
$uri = http::getSelfURI();
if (count($_POST) > 0){
$out = $core->tpl->getData($tpl);
apc_delete($uri);
} else {
$out = $core->tpl->getData($tpl);
$page = array();
$page['data'] = $out;
$page['contentType'] = $content_type;
apc_store($uri,$page,600);
}
5) Editez le fichier "/inc/core/class.dc.blog.php"
6) Cherchez la fonction "triggerBlog"
7) Ajoutez à la fin de la fonction :
apc_clear_cache("user");
8) Ouvrez le fichier index.php à la racine du blog et ajoutez ce code au début du fichier :
require_once 'inc/clearbricks/common/lib.http.php';
$uri = http::getSelfURI();
if (count($_POST) == 0){
$page= apc_fetch($uri);
if($page != null){
header('Content-Type: '.$page['contentType'].'; charset=UTF-8');
echo $page['data'];
exit;
}
}
Les pages compilées sont mises dans le cache mémoire APC et ont une durée de vie de 10 minutes. Vous pouvez augmenter ou diminuer cette durée en fonction du trafic sur votre blog. Lorsque le blog est mis à jour, le cache est purgé et les pages sont régénérées.
Remarque : Cette modification désactive tous les plugins qui réalisent des actions en temps réel (compteur de visites, nombre de pages vues .. etc). Cette modification n'impacte pas des outils comme Google Analytics basés sur du Javascript.
Des commentaires ?
UPDATE : Un thread dans le forum Dotclear 2 a été initialisé
Dernières News
Nuage de Tags
Archives
RSS des articles
Souscrire par email



Commentaires
Je ne connaissais pas APC mais est-il besoin d'APC il doit être possible de faire directement avec PHP non ? Je vais essayer. A+
Mais dotclear intègre déjà un système de cache à la base. Quel est l'apport de APC dans ce cas ?
DC2 intègre un cache pour la partie template, mais le peuplement du template lui provoque a chaque affichage la récupération des données en base. Ici il n'y a plus de requête qui s'exécute juste les connections d'ouvertures chez moi la page d'accueil tombe de 400ms a 40ms soit un gain de 10 pas avec APC car je suis sur du mutu 1and1 mes avec son même principe avec fichier.
Le système de cache de template n'est pas suffisant au niveau des performances. Ma dédibox a explosée hier à cause d'un traffic trop important.
Avec l'ajout du APC cache je ne monte plus au dessus des 40% de CPU consommé. Je pense qu'en montant le TTL du cache on peut encore gagner en conso CPU.
Grmblll ... je suis presque sûr qu'on peut en faire un plugin. On aura certes pas les performances optimales comme ici, mais ça aurait le mérite de ne pas modifier le core
Coté urlhandler, il suffit de surcharger les behaviors tplBeforeData et tplAfterData (si un callback renvoie true, ça interrompt le traitement).
Coté triggerBlog, si on demande gentiment à olivier, je suis sûr qu'on peut avoir un Behavior là aussi.
Reste à voir comment remplacer la modification de /index.php...
Point important dans ce billet, le javascript marche toujours. De là à dire qu'il suffirait que les modifications telles que les compteurs de lecture passent leurs requêtes en Ajax, il n'y a qu'un pas
--
Bruno
L'utilité d'un cache de page est vraiment indisensable quand on commence à avoir un gros nombre de commentaires et articles en base ..
J'ai beau avoir un serveur dédié qui héberge que ce site, j'ai cramé pas mal de CPU à Noël. Le cache joue maintenant vraiment un rôle important sur la charge CPU de la machine.
Je vais tester l'adaptation de ta technique avec le moteur eAccelerator dont l'api semble proche de celle d'APC.
A priori, sur les tests, eAccelerator semble plus performant et moins gourmand qu'APC et il est déjà installé sur mon serveur
Bon j'y arrives pas parce qu'eAccelerator a toutes ses fonctions de désactivées.
Raison invoquée: risque potentiels de sécurité
(http://eaccelerator.net/ticket/37)