La durée de vie des sessions en PHP, comment ca marche ?

04 Jan 2014

Les sessions PHP sont très couramment utilisées, mais peu de gens savent les configurer correctement.

Voici un petit exemple très simple :

session_start();

$_SESSION['count']++;

printf("Coucou, c'est la %d ème fois que tu affiches cette page !", $_SESSION['count']);

Ici, on va démarrer la session et incrémenter un compteur. Ainsi, la première fois que l’on va afficher la page on verra un 1, si on rafraichi la page un 2, et ainsi de suite.

Si on redémarre le navigateur, on verra le compteur repartir au début.

En effet, quand on démarre une session, on crée un cookie (par défaut appelé PHPSESSID) qui contient l’identifiant de la session PHP. Et, une nouvelle fois par défaut, ce cookie est défini pour expirer lorsque le navigateur est fermé.

On peut changer cette valeur en ajoutant la ligne suivante avant le session_start :

ini_set('session.cookie_lifetime', 9198000); // 9198000 = 365 jours en secondes

Ainsi, le navigateur va garder le cookie pendant un an. Mais, malgré cela, on pourra voir que la session est perdue de facon aléatoire.

Une nouvelle fois, la réponse se trouve dans la configuration de PHP et du garbage collector de sessions. En effet, à chaque appel de session_start, il y a une chance sur 100 pour que les sessions inactives depuis 20 minutes soient détruite. De ce fait, le cookie présent dans la navigateur pointera sur l’identifiant d’une session qui n’existe plus et une nouvelle sera crée.

Pour prolonger la durée de vie des sessions inactives, il suffit d’ajouter avant le session_start :

ini_set('session.gc_maxlifetime', 604800); // 604800 = 7 jours en secondes

Attention, si plusieurs applications sur le même serveur utilise des sessions, il faut les séparer sinon elles pourront être détruites par le GC de l’application qui a le plus faible gc_maxlifetime :

ini_set('session.save_path', '/path/to/my/app/sessions');

On peut aussi changer le pourcentage de chance que le GC soit lancé :

// 5% de chance de supprimer les sessions obsolètes
ini_set('session.gc_probability', 5);
ini_set('session.gc_divisor', 100);

Et voilà ! Maintenant nos sessions seront gardées pendant un an si l’utilisateur n’est pas absent pendant plus de 7 jours consécutifs :)

Plus d’info : http://php.net/manual/en/session.configuration.php