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é ?

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