WEB-d Développement Web

PHP, SQL, HTML5, CSS3, Javascript, Mootools, Référencement, SEO, CMS, e-commerce, Apache, Linux, Ubuntu, ...

Contrôle précis des sessions PHP

Le fonctionnement des sessions peut être contrôlé à l'aide des paramètres session.* dans php.ini. La liste complète est disponible sur le site PHP.

Le premier paramètre qui nous intéresse est session.save_path qui détermine dans quel répertoire les fichiers de session doivent être sauvés. Il n'est pas toujours configuré par défaut, et il faudra donc manuellement éditer /etc/php5/apache2/php.ini pour indiquer session.save_path /tmp par exemple.

Certains des paramètres de configuration, mais pas tous, peuvent être modifiés au moyen d'une fonction spécifique (comme session_save_path($path) par exemple). Pour plus d'uniformité, je préfère ne pas utiliser ces fonctions et toujours utiliser ini_set('nom_du_paramètre', valeur).

Cookies de session

Si un même serveur héberge plusieurs applications différentes (http://serveur/app1/ et http://serveur/app2/ par exemple), on souhaite généralement que l'utilisateur reçoive un numéro de session différent pour chaque application, afin de ne pas mélanger les données dans la variable $_SESSION. C'est possible en utilisant ini_set('session.cookie_path', '/app1') qui limite la portée du cookie de session aux pages situées dans http://serveur/app1.

Si l'application possède un seul point d'entrée (http://server/app1/index.php?page=abc), grâce à de l'URL rewriting par exemple, on peut même utiliser dirname($_SERVER['PHP_SELF']) dans index.php. Une configuration complète ressemblera donc à ceci:


ini_set('session.use_cookies',  true);
ini_set('session.use_only_cookies', true);
ini_set('session.cookie_lifetime', 5 * 60); // en secondes
ini_set('session.cookie_path',  dirname($_SERVER['PHP_SELF']));
ini_set('session.cookie_domain', "");
ini_set('session.cookie_httponly', true); // PHP 5.2.0. minimum
ini_set('session.use_trans_sid', false);

session_start();
 

Attention cependant que le cookie de session n'est envoyé qu'une seule fois, lors de la création de la session. La durée de session configurée avec session.cookie_lifetime (5 min dans cet exemple) est donc une durée absolue, depuis la création de la session, et ne correspond PAS à 5 min depuis la dernière page vue. Pour modifier ce comportement, il faut envoyer manuellement le cookie au navigateur à chaque page vue, par exemple en utilisant la fonction suivante après session_start():


setcookie(
    session_name(),
    session_id(),
    time() + ini_get('session.cookie_lifetime'),
    ini_get('session.cookie_path'),
    ini_get('session.cookie_domain'),
    ini_get('session.cookie_secure'),
    ini_get('session.cookie_httponly'));
 

Le Garbage Collector

Le Garbage Collector des sessions est chargé de supprimer les anciens fichiers de session qui ne sont plus utilisés. Par défaut, un fichier de session est supprimé 24h (1440 min) après sa création. Ce délais peut être changé en modifiant session.gc_maxlifetime (en minutes) dans php.ini.

Tout comme pour les cookies, ce délais démarre au moment de la création de la session. Pour modifier ce comportement, il faut créer soi-même un nouveau SessionHandler (voir session_set_save_handler()). Cependant, il vaut généralement mieux conserver le comportement par défaut, car il est recommandé de fixer une durée absolue maximale aux sessions, afin qu'un hacker qui aurait réussi un vol de session ne puisse garder un accès permanent à l'application.

Afin de ne pas rallentir l'affichage des pages, le Garbage Collector ne s'exécute pas à chaque page request, mais selon une probabilité calculée grâce aux options session.gc_probability / session.gc_divisor.

Articles similaires