dotclear,cache,mémoire

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é

1. Le , 21:12 par francis
4ff83a9dd8406af8e3f5257d67ce51fb

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+

2. Le , 01:34 par Dagnan
4bcdd5fb44aa756a70598f3a670a3b0e

Mais dotclear intègre déjà un système de cache à la base. Quel est l'apport de APC dans ce cas ?

3. Le , 09:18 par Francis
4ff83a9dd8406af8e3f5257d67ce51fb

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.

4. Le , 12:04 par Ludovic
9ab09dd3e305f924f8930e20e1a35843

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.

5. Le , 19:45 par Dsls
6fac031723bc0f5821bbe460877851a2

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

6. Le , 01:03 par Ludovic
9ab09dd3e305f924f8930e20e1a35843

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.

7. Le , 13:59 par Phoenix
05a91228c6a82f5bbbc97e9d031a813c

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 :)

8. Le , 22:18 par Phoenix
05a91228c6a82f5bbbc97e9d031a813c

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)

9. Le , 09:20 par Pilou
ba52899789a0bff481edecd24e386a26

Bonjour, est-ce que c'est encore adapté pour dotclear 2.4.4 ?
(4 ans ont passé)

10. Le , 22:33 par Ludovic
9ab09dd3e305f924f8930e20e1a35843

@Pilou : Mes modifications ont pas mal changées depuis cette époque. Il existe maintenant un plugin Dotclear APC pour cacher les pages dans APC.
La solution idéale ressemble à celle-ci : http://www.geeek.org/post/l-archite...
Sur Geeek, j'ai totalement réécrit mon index.php. Toutes les pages du site sont mis en cache dans un Memcached.

11. Le , 08:28 par Pilou
b424afe099da568c6e52b9df2783f38d

Merci, je vais aller lire ça !

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.