Nettoyage des sessions dans eZ Publish (bug #10431)

J'ai remarqué que sur plusieurs sites que la table ezsession chargée de stocker les données de session dans eZ Publish n'est jamais nettoyée, les données de session expirée s'accumulent. Selon la fréquentation du site, on obtient à plus ou moins long terme une table avec des millions d'enregistrements ce qui provoque au choix des ralentissements, des vérifications (mysqlcheck) interminables, des problèmes pour faire les backups (mysqldump de plusieurs gigas) voire carrément une corruption de la base de données. J'ai d'ailleurs rapporté ce bug il y a quelques temps en proposant un script de 8 lignes (dont 4 inutiles...:-) à lancer via le système de cronjobs d'eZ Publish. Je ne suis visiblement pas le seul à avoir rencontré ce problème. Dans un fil du forum sur le même sujet, Xavier Dutoit propose d'utiliser le script update/common/scripts/cleanup.php pour supprimer les sessions expirées. Markus Bader a créé l'extension Session Cleanup pour régler ce problème.

Mais quel est la vraie origine de ce problème ? Richard Bayet apporte la lumière sur ce problème en citant un commentaire de la documentation PHP officiel sur une spécificité de Debian. Pour résumer, eZ Publish intègre son propre gestionnaire de session pour stocker les données en base plutôt que dans des fichiers. Or, sous Debian et dérivés, le nettoyage (Garbage collector) des anciennes sessions est assurées par un script shell lancé régulièrement par cron plutôt que par la fonction gc définit avec session_set_save_handler pour plus de sécurité dans l'utilisation du gestionnaire par défaut qui travaille avec des fichiers. Évidemment ce script est incapable de supprimer les sessions en base... Le lancement d'un script spécifique de manière asynchrone est donc nécessaire pour Debian et dérivés. Tout s'explique donc.