Les sessions sur plusieurs serveurs avec PHP et Memcached
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 2 commentaires
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 …
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)