PHP et les sessions : durée de vie, utilisation avancée et quelques subtilités (1) Un ramasse-miettes pour supprimer les données persistantes d'une session

Nous avons vu ce qui causait la mort d'une session du côté du client, mais lorsque le cookie est supprimé, ou que l'identifiant n'est plus transmis, les données stockées sur le serveur ne sont pas supprimées pour autant.

PHP a donc mis en place un système de ramasse-miettes (ou garbage collector en anglais) chargé de supprimer ces données persistantes au bout d'un certain temps. Cependant, ce temps n'est pas nécessairement le même que celui de la durée de vie du cookie.

L'appel du rammasse-miettes s'effectue aléatoirement lors du démarrage de la session

La durée de vie des données sur le serveur est définie par la directive session.gc_maxlifetime. Si les données ont été supprimées du serveur avant que la session ait expirée chez le client, cette dernière est tout de même réinitialisée. Il faut donc considérer (et c'est bien théorique, voir ci-après) que la durée de vie réelle d'une session est la plus petite des valeurs entre la durée de vie du cookie et la durée de vie des données sur le serveur.

La donnée ne sera effectivement supprimée que lorsque le ramasse-miette sera appelé. Cette action est effectuée aléatoirement lors du démarrage de la session, la probabilité de son déclenchement est défini par deux directives : session.gc_probability et session.gc_divisor. On a donc :

 probabilité d'appel = gc_probability/gc_divisor

Les valeurs par défaut sont respectivement 1 et 100, la probabilité est donc 1/100.