Approche de Memcache avec PHP

Memcache est un module PHP additionnel. C’est un « serveur de cache ». Il s’agit d’un démon UNIX qui tourne sur un serveur et qui enregistre/sert tout type de variable. Voici un aperçu assez complet de son utilisation. Je ne vais pas expliquer son installation, puisque tout est expliqué très clairement sur la documentation de PHP.

Vous pouvez passer depuis PHP tous types de variables, puisque le module s’occupe de sérialiser les éléments non gérés en natif par memcache (soit tout ce qui n’est ni un chiffre ni une chaine de caractère). Vous pouvez donc vous servir de memcache pour mettre en cache un nombre, une chaine de caractère, un tableau ou un objet.

Vous pouvez gérer un pool de serveur Memcache avec le module PHP. Si un serveur est inaccessible, la librairie ira automatiquement se connecter à un autre serveur. Cette partie est donc totalement externalisée et vous n’aurez donc pas à vous en occuper depuis PHP (ou presque).

Voici comment s’utilise Memcache point par point. Je travaillerais uniquement avec l’approche objet 😉

Création de l’objet memcache

$memcache = new Memcache();

Si vous voulez vraiment configurer memcache jusque dans les moindres détails, regardez les options disponibles dans php.ini :

memcache.allow_failover A laisser à 1 si vous allez utiliser plusieurs serveurs Memcache

memcache.chunk_size Configuration réseau (taille des paquets). Je vous laisse choisir la meilleure valeur 🙂

memcache.default_port Port par défaut

Définition des serveurs memcache existants

Il y a deux approches pour se connecter à Memcache. Tout d’abord en multi-serveur :

$memcache = new Memcache(); 

$memcache->addServer('memcache_host', 11211); 

$memcache->addServer('memcache_host2', 11211);

Dans ce cas, n’utilisez PAS Memcache::Connect() qui va réinitialiser la liste de serveurs disponibles. Il vous suffit de faire vos Get, Set et Add, le module s’occupe de se connecter ou réinitialiser une connection si besoin est.

Enregistrement d’une variable dans Memcache

Une fois la connexion établie, enregistrons une variable toute bête :

$memcache_obj->add('var_key', 'test variable', false, 30);

  • Premier argument : le nom de la variable 
  • Deuxième argument : la valeur de la variable 
  • Troisième argument (facultatif) : si il faut compresser la variable avec zlib. Si oui, passez la constante MEMCACHE_COMPRESSED ici. 
  • Dernier argument : temps de vie de la variable. Si 0, alors la variable n’expire jamais. Vous pouvez également définir un timestamp unix, ou le nombre de secondes à partir de maintenant. Dans ce dernier cas, la valeur ne doit pas dépasser 30 jours soit 2592000 secondes.

Attention à la durée de vie du cache : rien ne garantit que la variable va rester tout ce temps. En effet, si le démon Memcache n’a pas assez de mémoire, il va supprimer les variables les plus anciennes pour pouvoir enregistrer les nouvelles.

Il existe également la fonction set() qui fait la même chose que add, mais qui remplace la variable si elle existe déjà, alors que add renvoie une erreur en cas de doublon. Enfin replace() qui est comme set() mais renvoie une erreur si la variable n’existe pas.

Récupération de données

On passe par la fonction Get. 

$var = $memcache_obj->get('some_key');

Petite astuce : si vous allez avoir besoin de plusieurs variables, vous pouvez passer un tableau de clefs :

$var = $memcache_obj->get(Array('some_key', 'second_key'));

Incrémenter/décrémenter

A noter la présence de fonctions propres au stockage de nombres : incrémentation du compteur de 3: 

$current_value = $memcache_obj->increment('counter', 3);

incrémentation du compteur de 1: 

$current_value = $memcache_obj->increment('counter');

Même principe avec decrement() 🙂

Attention : ne marche pas avec les données compressées (cf 3e argument de Set() ) !

Fonctionnalités avancées

Je présente rapidement les autres fonctions :

$stats = $memcache_obj->getStats(); 

et 

$stats = $memcache_obj->getExtendedStats();

Qui renvoie un tableau avec des statistiques sur le serveur : octets échangés, charge, etc. Ca peut servir lors du développement mais c’est inutile en production (sauf si vous mettez en place un systeme poussé de pondération des serveurs Memcache en fonction de la charge sur chacun …).

$memcache_obj->setCompressThreshold(20000, 0.2);

Pour activer la compression automatique des variables plus grosses que X octets, X étant le premier argument.

Voilà c’est tout pour cette première approche. Je vous posterais bientôt des tests de performance de Memcache.

N’hésitez pas à poser toutes vos questions sur ce module dans les commentaires !

5 réflexions sur « Approche de Memcache avec PHP »

  1. bonjour;
    je veux une solution…….
    j’ajoute le memcache dans le code php et je veux cacher un tableau grand de tableau, mais j’ai un probléme, je pense dans la taille de mémoire de memcache.
    voici message d’erreur:
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262213 bytes on ligne
    $memcache->set($key,$res_cache,0,3600)
    merci d’avance.

  2. wiem: La limite de mémoire n’est pas côté Memcache d’après le message d’erreur, mais côté PHP. Il te faut donc découper ton tableau en plusieurs morceaux et stocker chaque morceau séparément.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *