Choses à faire

24h dans une journée, et tant de choses à faire !

Les sessions sur plusieurs serveurs avec PHP et Memcached

publié le 15 mars 2010 par Pierre Quillery

Si vous utilisez plusieurs serveurs frontaux pour héberger votre application PHP, (ou que vous prévoyez de le faire) vous allez devoir faire face à un problème un peu ennuyeux : la variable $_SESSION ne fonctionnera plus. En effet la session PHP n’est disponible que sur le serveur en cours : si l’internaute se retrouve aléatoirement sur un serveur parmis X, les chances sont fortes qu’il perde régulièrement sa session.

Heureusement, les solutions possibles sont nombreuses et facile à mettre en place. Elles reposent toutes sur deux principes : a) l’utilisation d’un cookie déposé sur le navigateur pour identifier la session de l’internaute et b) l’utilisation d’un moteur quelconque pour stocker et lire un tableau de données.

Les possibilités pour le second point sont nombreuses : on pourrait imaginer déposer simplement des fichiers dans un répertoire partagé accessible par tous les serveurs ou encore créer une table SQL « en mémoire » sur un serveur donné pour améliorer les performances d’accès …

Nous allons nous pencher sur une troisième méthode qui à mon avis est la plus intéressante, notamment parce qu’elle se prête naturellement à une mise à l’échelle : il s’agit de memcached.

Ce qu’il faut savoir sur memcached tient en deux lignes : il s’agit simplement d’un serveur permettant de lire et d’écrire ce que vous voulez dans la mémoire de un ou plusieurs serveurs, le tout de façon transparente. Notez que des clients sont disponibles dans tous les langages possibles (peut-être pas en brainf*ck, mais c’est l’exception qui confirme la règle ;) ).

Installation

Sur votre serveur debian/ubuntu de base, l’installation est relativement simple : nous allons tout d’abord installer le serveur memcached lui-même. Vous pouvez immédiatement répéter cette opération sur tous les serveurs que vous souhaitez utiliser pour stocker les sessions.

Maintenant, nous devons encore installer le client PHP qui nous permettra de dialoguer avec ce même serveur.

Mise en place du cookie de session

Maintenant que notre environnement est en place, nous allons pouvoir commencer les choses sérieuses. Notre première tâche va être de définir manuellement un cookie de session :

La variable $token_session contiendra maintenant l’identifiant unique de la session, c’est avec lui que nous allons travailler dans la seconde partie. Notez qu’il est difficile/impossible de voler la session, car cet identifiant a été généré grâce à la fonction uniqid().

Récupération et enregistrement de données

Maintenant, nous allons pouvoir facilement lire et enregistrer la session basée sur memcached, grâce à cette petite classe :

Il ne nous reste plus qu’à instancier la classe SessionMemcached en lui passant en paramètre l’identifiant que nous avons créé précédemment, et le tour est joué :

Conclusion

Simple, rapide et efficace, memcached présente pas mal d’avantages même au delà de la gestion d’une session … Quelles autres utilisations lui avez-vous trouvé ?

Commentaires 4 commentaires

Nico
29/04/2010

Pas mal comme utilisation.
Attention tout de même à ne pas stocker de données sensible dans la session car memcached ne vérifie pas les écoutes du port (comme le ferait MySQL avec login et password)

Pierre Quillery
01/05/2010

Bon effectivement il faut être vigilant, mais là c’est plus une affaire de bonne configuration du serveur que de développement à proprement parler : si c’est un serveur à part tu ouvres l’accès au port du daemon memcached uniquement pour l’IP de la machine qui en a besoin, et si c’est le même serveur tu bloques simplement tout ce qui entre sur ce port – mais finalement, tu fais normalement la même chose pour une base mysql si je ne m’abuse :p …

Arnaud
12/12/2010

memcache est-il la bonne solution pour gérer des données partagées entre plusieurs utilisateurs ? Existe-t-il un mécanisme de trigger dans ce cas ?

Pierre Quillery
09/02/2011

Bonjour Arnaud, désolé pour le (très) gros retard dans la réponse, ce site est actuellement un peu mis en veille par manque de temps … Cela étant dit, je ne suis pas sûr de bien comprendre votre question : on pourrait effectivement imaginer que plusieurs utilisateurs différents mettent à jour simultanément (ou presque) les même données, par exemple dans le cas d’un document texte partagé, mais il faudrait pour cela gérer la problématique de la concurrence d’accès et du « versionnage » du document à un autre niveau que celui de memcache, qui ne sert vraiment qu’à écrire et lire des données (sauf erreur de ma part).

Déposer un commentaire !





Les textes, illustrations et démonstrations présents sur ce site sont la propriété de leurs auteurs respectifs, sauf mention contraire (photo de la bannière).
Chosesafaire.fr, un site propulsé par Wordpress, vous est proposé par Pierre Quillery & Killian Ebel.

Valid XHTML 1.0 Strict