Dès lors qu’une architecture web doit grossir se pose le problème de l’accès aux sessions. Avec un seul serveur web, pas de soucis, les sessions PHP sont stockées comme fichiers sur le disque dur local. Mais pour répondre à des exigences de haute disponibilité ou de montée en charge, il est nécessaire de prévoir une infrastructure avec au moins 2 serveurs web couplés un load balancer comme LVS ou du Round Robin DNS. Ce pose alors le problème d’accès aux sessions utilisateurs. Une même session doit être accessible depuis les X serveurs web de l’infrastructure. Un serveur memcached et une configuration adéquate de PHP résout parfaitement ce problème.

Parmi les solutions de partir de sessions PHP, je déconseille vivement:

  1. Stockage des session dans une table MySQL : risque de saturer inutilement votre serveur de base de données, lenteur
  2. Stockage sur un serveur NFS : bien que performante, cette solution présente un inconvénient majeur. En cas du panne du serveur NFS il est souvent très difficile de remonter les répertoires partagés sur les serveurs web, voire impossible sans un reboot.

  • Serveur memcached

Définition officielle : "memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load". Un service réseau de haute performance destiné à stoquer des objets (tout et n’importe quoi) en mémoire. Il convient très bien à un utilisation dans un environnement web dymanique et permet d’alléger la charge de base de données.

Dans le cas présent, memcached ne sera utiliser que pour stocker les sessions PHP. On pourrait aussi l’utiliser pour partager des ressources graphiques, pour stocker des rendus HTML pré calculés de page web (cache), etc

Le service memcached sera indispensable au bon fonctionnement du système. Autant l’installer sur le serveur qui est déjà indispensable : le serveur de base données. Il faut éviter les "single points of failure".

Télécharger le RPM : memcached (DAG)

rpm -Uvh memcached-xxx.rpm
chkconfig memcached on
/etc/init.d/memcached start

La configuration par défaut devrait suffire, au besoin, jeter un oeil au fichier : /etc/sysconfig/memcached

  • Module PECL

Le module PHP memcache permet de stocker les sessions sur un serveur memcached de façon automatique. Aucune modification des sites web ne sera nécessaire, juste un peu de configuration.

Télécharger le RPM : php-pecl-memcache (DAG)

rpm -Uvh php-pecl-memcache-xxx.rpm

Le package installe un fichier de configuration : /etc/php.d/memcache.ini. Les valeurs par défaut devrait convenir à la majorité des systèmes. Il suffit d’y modifier l’adresse IP du serveur memcached.

# exemple avec l'adresse 10.1.1.10 du serveur memcached
session.save_path="tcp://10.1.1.4:11211?persistent=1&weight=1&timeout=1&retry_interval=15";
  • Tests

Après avoir redémarrer apache.

/etc/init.d/httpd restart

Tester une page web qui fait appel aux sessions, cela devrait fonctionner et le répertoire/var/lib/php/session rester vide.

 

Afficher le contenu brut d’une session :

 

connect(MEMCACHED_IP, 11211) or die ('Connexion impossible');
var_dump ($memcache->get(SESSION_ID));
?>