Contexte

La plupart des applications développées en PHP utilisent les sessions pour stocker les informations qui doivent être conservées durant la navigation.

Lors de la mise en place de plusieurs serveurs (répartition de charge, tolérance de panne, etc) il est nécessaire de partager les sessions entre les différentes machines.

J'ai longtemps utilisé la solution triviale de rediriger les sessions vers un partage NFS.

Memcached est un service distribué gérant un cache d'objets en mémoire, très performant, générique par nature, mais particulièrement bien adapté à l'accélération des applications web. Nous allons voir comment l'utiliser comme gestionnaire pour les sessions PHP.

Installer le service memcached

Sur quelle machine monter le service ? La machine doit être disponible pour l'application, une solution consiste à la mettre sur la même machine que le serveur de bases de données, lui aussi indispensable à l'application (je ne connais pas beaucoup d'application sans base de données).

Le service est peu consommateur de charge processeur, mais peut nécessiter une grande quantité de mémoire.

Installation :

yum install memcached

Configuration :

Les options sont enregistrées dans le fichier /etc/sysconfig/memcached :

PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="64" OPTIONS=""

Il pourra être utile d'augmenter la taille du cache, définie par défaut à 64 Mo.

Sécurité : ce service n'est pas sécurisé, on ne l'utilisera donc pas sur une machine connectée à internet sans protéger son port d'écoute par une règle de parefeu. Dans le cas d'un serveur disposant de plusieurs adresses IP, il est possible de préciser sur quelle adresse écouter en ajoutant l'option -l.

Activation :

chkconfig memcached on
service memcached start

Installer le gestionnaire de session

Le client PHP est disponible en tant qu'extension PECL (voir memcache) qui depuis la version 2.1.0 fournit aussi un gestionnaire de sessions.

Le paquet est disponible pour Fedora, RHEL et CentOS dans les dépôts officiels et ici (voir : php-pecl-memcache).

Installation :

yum install php-pecl-memcache

Configuration :

Les options sont prévues (commentées) dans le fichier /etc/php.d/memcache.ini. Il suffit de les décommenter et de les adapter :

; Use memcache as a session handler
session.save_handler=memcache
; Defines a comma separated of server urls to use for session storage
session.save_path="tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

Activation :

Il suffit ensuite de relancer le serveur Apache afin de prendre en compte l'extension et sa configuration :

service httpd restart

Les informations retournées dans les informations PHP permettent de vérifier la configuration :

# php -m | grep memcache
memcache
# php -i | grep -i session
Session Support => enabled
...
session.save_handler => memcache
session.save_path => tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15
...

Conclusion

J'espère que ce petit didacticiel vous aura donné envie d'essayer ce gestionnaire de sessions alternatif. Et comme toujours, vos commentaires sont les bienvenus.