Worpdress – Un simple système de cache avec memcache

Publié le 18 décembre 2011 par Gpenverne

Auparavant, j'utilisais wp-super-cache pour mettre en cache les pages de geekndev. Mais il s'avère qu'en basculant le blog sur un kimsufi (config serveur différente du précédent serveur, donc), j'obtenais, souvent, des erreurs 500, inexplicables (rien dans les logs apache, et pas de changement en vidant wp-super-cache, et les erreurs 500 étaient aléatoires).

Et je me suis aperçu qu'au final, le contenu le plus dynamique d'un blog wordpress, ce sont les commentaires. Or, disqus les affiche et les gère en JS. Donc, geekndev présente un contenu très facilement cachable.

Et wp-super-cache s'avérait trop lourd pour cacher ce contenu très simple à cacher. Je me suis donc dit: et si je cachais moi même les pages, sans passer par un plugin ?

La logique est simple: lorsque l'utilisateur visite une page, il faudrait vérifier si la page n'est pas déjà cachée. Deux possibilités :
1) la page est présente en cache => On affiche la version cachée.
2) la page n'est pas présente en cache => on la cache et l'affiche.

J'ai donc modifié le fichier index.php de wordpress de la manière suivante :

Avant le bloc :

/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

(en début de fichier, donc)
J'ai ajouté :

$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$key = 'gnd_'.md5($_SERVER['REQUEST_URI']);
$memcachedData = $memcache->get($key);
if($memcachedData)die($memcachedData.'<!-- memcached - OK -->');
ob_start();

En fait, nous allons récupérer tout le contenu affiché avec le système ob_start() / ob_get_clean()

En fin de fichier, j'ai ajouté :

$content = ob_get_clean();
if(!defined('timeExpires'))define('timeExpires', 86400);
$memcache->set($key, $content, false, timeExpires) or die($content.'<!-- unable to memcacheSet -->');
die($content.'<!-- memcached for '.timeExpires.'s ->');

On remarquera l'utilisation d'une constante timeExpires. Celle-ci, si elle n'est pas défini, sera égale à 86400 (24h).

Sur les fichiers de mon thème, j'ai ajouté :
define(‘timeExpires', 300) sur le fichier index.php , afin de limiter le cache de la page d'accueil à 300 secondes (5 minutes).

Et … ça marche :)

Alors effectivement, cela implique de modifier le fichier index.php de wordpress, qui risque de sauter en cas de mise à jour de wp. Donc, solution un peu discutable.

Hormis cela, je ne vois pas du tout de limite à ce système, que je trouve bien pratique :)

Articles susceptibles de vous intéresser également


Infographie - Python vs Ruby vs Php


Vous avez aimé cet article? Suivez Geekndev sur Facebook!

Publier sur Facebook