Ecrit le

Un article de Gpenverne

Memcache est une solution de cache installable sur des environnements linux, permettant de conserver directement en mémoire vive les informations que vous souhaitez. Le résultat surprend: les performances s'en voient très largement améliorées, notamment s'il est appliqué aux requêtes mysql, comme l'a par exemple fait @maxime (cf, sur son blog : http://maxime.sh/2010/03/linfrastructure-vdm-memcache/ ) pour vdm.



Installation


Sous debian/ubuntu, un simple apt-get suffit :


apt-get install memcached


Installez ensuite l'extension php :


pecl install memcached


Pensez à rajouter dans votre config apache :


extension=memcached.so


 


Configuration


La configuration de memcache s'effectue dans le fichier /etc/memcached.conf .


Ce fichier contient notamment le port, et l'adresse ip d'écoute.


# Default connection port is 1121

-p 11211


# Specify which IP address to listen on. The default is to listen on all IP addresses

# This parameter is one of the only security measures that memcached has, so make sure

# it's listening on a firewalled interface.

-l 127.0.0.1


Pour une configuration "mono-serveur", l'ip du localhost fonctionne parfaitement. Si vous souhaitez utiliser le memcache de votre serveur à partir d'un autre, il vous faudra mettre l'adresse ip externe. Memcache n'offre aucun protection à ce niveau, pensez donc à configurer vos iptables de manière à n'autoriser que les ip de votre choix à accéder au port que vous avez choisi.


Le fichier de configuration contient également la quantité de mémoire allouée à memcache (par défaut, 64mo)


# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default

# Note that the daemon will grow to this size, but does not start out holding this much

# memory

-m 64


 


Utilisation avec Php



  • Création de l'instance memcache


[sourcecode language="php"]
< ?php $memcached=new Memcache; ?>
[/sourcecode]

  • Ajoutez des serveurs à votre memcache


[sourcecode language="php"]
< ?php $memcached->addServer('ADRESSE_IP',  port, priorité);  ?>
[/sourcecode]

  • Initialisation du serveur memcache


Si votre memcache fonctionne en standalone,  il vous faudra également vous connecter au serveur memcache local :


[sourcecode language="php"]
< ?php $memcached->connect('localhost', 11211); ?>
[/sourcecode]

Si vous utilisez plusieurs serveurs memcache, la phase de connexion au serveur memcache est inutile : memcache le fait tout seul en choisissant l'un des serveurs mis à sa disposition.



  • Mettre quelque chose en mémoire avec memcache :


[sourcecode language="php"]
< ?php $memcached->set($name,  $value, $duree) ; ?>
[/sourcecode]

$name correspondant au nom que vous donnez à l'emplacement mémoire (pour pouvoir l?appeler ensuite)


$value correspondant à la valeur que vous souhaitez sauvegarder


false/true correspondant à la compression gzip de ce que vous sauvegarder (booléan, true pour compresser, false pour ne pas compresser)


$duree correspondant à la durée durant laquelle l'information doit être stockée, sous forme de timestamp unix relatif ou absolu.


 



  • Récupérer ce que vous avez mis en mémoire avec memcache


[sourcecode language="php"]
$memcached->get($name);
[/sourcecode]

Retourne true ou false, en fonction de si memcache a retrouvé, ou non, l'élément que vous demandiez.



  • Supprimer un élément stocké


[sourcecode language="php"]
$memcached->delete($name);
[/sourcecode]

 


Des possibilité plus étendues sont envisageables pour votre apache, notamment la gestion des sessions via memcache.

Pour une utilisation avec mysql, il vous faudra donc penser aux requêtes qui sont memcachables : par exemple, le contenu d'un article (amené à peu changer), le pseudo d'un utilisateur, etc. En spécifiant une durée de vie limitée (1h, 1 jour,  le 20 avril 2011 ...), vous vous assurez d'une part que votre mémoire memcache ne sature pas, mais également que votre cache est à jour.


Il existe, de plus, des utilitaires de monitoring memcache, qui vous permettront de surveiller l'état de votre memcache (notamment en ce qui concerne le pourcentage d'espace libre, et l'utilisation réseau par exemple). Regardez par exemple phpMemcachedAdmin


 


 


Gpenverne

Gpenverne

Développeur backend symfonien, qui trouve toujours moyen de faire des machins avec des bidules même si ce n'est pas utile.