msgbartop
De tout et de rien
msgbarbottom

11 Fév 09 Memcached Backend avec plusieurs installations WordPress

Pour utiliser Memcached avec WordPress, vous devez  installer le Memcached Backend.
Si ce n’est pas encore fait,  installez le serveur Memcached et  son client PHP.

Memcached Backend marche très bien à condition de n’avoir qu’un seul blog, qu’une installation de WordPress.

Si ce n’est pas le cas, c’est la cata. Il va utiliser les mêmes clefs pour stocker/cacher les données de tous les blogs. En gros, si vous avez le blog A, B et que vous essayez d’accéder au blog B vous verrez les données (posts, commentaires, etc..) du blog A. Vous imaginez le boxon !  Et bien moi j’ai testé 😀

Memcached pour stocker des données utilise une clef qui doit être unique. A chaque clef correspond une valeur. La clef est comme votre nom de variable dans votre code PHP.

J’ai donc regardé le code du fichier object-cache.php et je l’ai modifié. Après un essai infructueux, je pense que la modif est bonne. Je n’ai pas encore vu de bug 🙂

Pour rendre object-cache.php compatible avec plusieurs installations WordPress, il suffit de replacer le code de la  function key($key, $group) du fichier object-cache.php  par ce code :


function key($key, $group) {
global $blog_id;
if ( empty($group) )
$group = 'default';
// C'est ici que vous devez mettre l'identifiant unique de votre blog, par exemple son adresse
// Chaque blog doit avoir un prefix key différent, ici j'ai mis blog.koreus.com
$prefix = 'blog.koreus.com' . ':';
return preg_replace('/\s+/', '', "$prefix$group:$key");
}

Le fichier object-cache.php modifié doit ensuite être copié dans le répertoire wp-content de votre blog.

Ce n’est pas une solution super propre mais elle marche (en tout cas elle a l’air).

Avertissement 

  •  Cette modif ne doit pas être utilisée sur une installation WordPress MU
  • Attention à ne pas mettre de prefix trop long. Car la longeur total de la clef (prefix+tout le reste) ne doit pas dépasser 250 caractères

11 Fév 09 Memcached

J’entends parler de memcached comme la solution miracle pour optimiser son site. Digg l’utilise, Facebook l’utilise et d’autres sites à fort trafic. Memcached a été développé à l’origine pour les besoins de LiveJournal (une plateforme de blogs). 

J’avais regardé à l’époque vite fait de quoi il en retournait mais cela restait très obscure. Dernièrement, je me suis jeté à l’eau.  Et j’ai compris que memcached stockait simplement des données en mémoire (explication basique). 

Et MySQL alors ? La principale utilisation de Memcached : cacher les requêtes MySQL. Mais il faut savoir que Memcached ne se limite pas à MySQL.

Le principe, c’est de mettre en cache dans memcached les requêtes lourdes.  Le resultat de la requête se trouvera dans memcached. Au lieu de faire un SELECT compliqué sur une base de données avec des accès disques, on fait simplement un accès à la mémoire.

Mauvaise nouvelle, pour utiliser Memcached avec MySQL, il faudra adapter son code PHP. 
Bonne nouvelle, si vous utilisez une application PHP, comme WordPress, MediaWiki, etc … vous trouverez surement des plugins qui vous permettront de greffer memcached facilement.

Installation de Memcached

Pour l’utiliser, il faut l’installer, c’est con non ?

# emerge --ask memcached

Ensuite, il faut le démarrer (c’est un serveur)

# /etc/init.d/memcached start

Par défaut, memcached se lance en localhost sur le port 11211 et alloue 64 Mo de mémoire. Vous pouvez changer cela en modifiant le fichier de configuration (/etc/conf.d/memcached)

Installer un client PHP : PECL Memcache

Pour utiliser memcached, il faut se connecter au server memcached avec un client. Si vous développez en PHP, il vous faudra un client memcached pour PHP, j’ai nommé  PECL Memcache.

Pour l’installer sur gentoo, voici la manip à faire :
# echo "=dev-php5/pecl-memcache-3.0.1" >> /etc/portage/package.keywords
# emerge -pv dev-php5/pecl-memcache

Et voilà. Redémarrez votre serveur web (apache) et vous devriez voir apparaitre memcache dans votre phpinfo.

Pour l’utiliser, c’est simple, voici un petit bout de code assez clair :

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Connexion impossible");
$version = $memcache->getVersion();
echo 'Version du serveur : '.$version;
// On stocke koreus dans la clef "key"
$memcache->set('key', 'koreus', false, 10) or die ("Echec de la sauvegarde des données sur le serveur");
echo "Les données ont été stockées dans le cache (les données expireront dans 10 secondes)";
// On recupère la valeur de la clef "key"
$get_result = $memcache->get('key');
echo 'Données depuis le cache : '. $get_result;
?>

Toute la doc pour utiliser le client se trouve à cette adresse :  PHP Memcache