PHP et les sessions : durée de vie, utilisation avancée et quelques subtilités (1) Le mécanisme des sessions de PHP

PHP met à disposition un ensemble de fonctions permettant de manipuler un mécanisme de sessions : un moyen efficace de conserver des données entre deux requêtes avec lequel vous êtes probablement familier. On s'en passe difficilement sur un site Internet interactif !

Bien que ce mécanisme soit assez simple à manipuler, il reste néanmoins quelques subtilités qu'il faut connaître pour en profiter pleinement et éviter des erreurs regrettables. On s'intéressera tout particulièrement à la durée de vie des sessions.

Si aucun identifiant de session n'a été transmis dans la requête, alors PHP générera une valeur aléatoire

Le mécanisme des sessions de PHP peut se comprendre assez simplement. Le serveur attribue un identifiant unique à l'utilisateur, qui sera retransmis à chaque requête (par le biais d'un cookie ou d'une variable dans l'URL). PHP utilisera cet identifiant pour retrouver les données de l'utilisateur qu'il stocke sur le serveur.

Dans un script php, une session démarre lors d'un appel à la fonction session_start(), cet appel est implicite si la directive session.auto_start du php.ini vaut on. Si aucun identifiant de session n'a été transmis dans la requête, alors PHP générera une valeur aléatoire renvoyée à l'utilisateur. Si un identifiant existe, PHP remplira la variable globale $_SESSION des données enregistrées.

   1.     <?php
  2.     // Initialisation des sessions
  3.     session_start();
  4.      
  5.     // On accède à une variable de session, et
  6.     // on l'écrit si elle n'existe pas encore
  7.     if(!isset($_SESSION['foo']))
  8.     $_SESSION['foo'] = 'bar';
  9.      
 10     echo $_SESSION['foo']; // La variable est utilisable dans le script courant

 

Les fonctions session_register() et session_unset() ne doivent plus être utilisées (elles sont considérées comme obsolètes).

Les données de session sont protégées en écriture : cela signifie qu'un seul script à la fois sera en mesure de les modifier. Ce comportement peut ralentir l'exécution de requêtes simultanées (avec les frames ou Ajax par exemple), l'enregistrement de la session sera retardé en attendant que le ou les autre(s) script(s) soi(en)t terminé(s). Pour limiter cette attente, vous pouvez appeler explicitement la fonction session_write_close() (ou son alias session_commit()).