PHP et les sessions : durée de vie, utilisation avancée et quelques subtilités (1) L'enjeu de la gestion de la durée de vie des sessions

Deux cas : les sessions gérées par URL ou par cookies

 

L'un des points les plus délicats à appréhender dans le mécanisme des sessions concerne la durée de vie. Dans cette section, nous allons voir qu'il y a plusieurs facteurs qui permettent de déterminer la durée de vie d'une session.

On doit, dans un premier temps, distinguer le cas pour lequel l'identifiant de session est transmis par l'URL de celui où un cookie est utilisé.

Dans le premier cas, la session existera tant que l'identifiant sera transmis par l'URL. En fait, même en recopiant la même adresse dans un autre navigateur, la session sera retrouvée.

Si on utilise un cookie, la durée de vie d'une session dépendra de la durée de vie du cookie

Si on utilise un cookie, la durée de vie d'une session dépendra de la durée de vie d'un cookie. Cette durée est définie à l'aide de la directive session.cookie_lifetime. Si cette valeur vaut 0, alors le cookie sera maintenu par le navigateur tant que ce dernier ne sera pas fermé par l'utilisateur.

La plupart des directives de manipulation des sessions définies dans la configuration de PHP peuvent être modifiées dynamiquement pour un script, à condition que ces modifications interviennent avant le démarrage d'une session avec session_start(). Si le démarrage automatique est actif, vous ne pourrez pas manipuler ces valeurs. Pour pouvoir faire quelques tests, j'ai utilisé la fonction session_set_cookie_params().

 

Un script pour gérer la vie d'une session

 

Le script qui suit affiche la durée de vie restante du cookie de session et une chaine de caractère définie à la création de la session. Tant que cette valeur ne change pas, cela signifie que la session utilisée est toujours la même.

  1.     <?php
  2.     // Durée de vie de la session (Time To Live)
  3.     $ttl = 10;
  4.     session_set_cookie_params($ttl);
  5.      
  6.     session_start();
  7.
      
  8.     if(!isset($_SESSION['foo']) || !isset($_SESSION['bar'])) {
  9.     $_SESSION['bar'] = uniqid();
 10.     $_SESSION['foo'] = time()+$ttl;
 11.     }
 12.
      
 13.     echo 'TTL de la session ('.$_SESSION['bar'].') : '.(($_SESSION['foo'])-time());

 

Voici quelques tests que j'ai effectué :

 En choisissant la valeur 10 pour la variable $ttl et en actualisant régulièrement la page, on voit la valeur TTL diminuer puis la session se renouveler (nouvelle chaine de caractère affichée);
 En choisissant la valeur 60, j'ai eu le temps de relancer mon navigateur avant la suppression du cookie, et de constater que la session était toujours active;
 En choisissant la valeur 0, la session était toujours active plus d'une heure après sa création, mais elle n'a pas résisté à la fermeture d'un navigateur.