PHP -
Écrit par Durand Franck


Publié le 01.03.10
Dans certains cas bien précis, il peux être utile d’avoir une session PHP partagé, c’est à dire, commune a tous les utilisateurs. Or, bien que je n’ai pas poussé beaucoup les recherches, tout le monde dis que c’est impossible en PHP et je ne suis pas d’accord. Je vais vous démontrer que c’est bien possible.
Tout d’abord il faut bien comprendre comment fonctionne une session PHP.
Les sessions PHP sont par défaut gérées par le gestionnaire de session PHP, qui les stockent sous la forme d’un fichier. Le nom de ce fichier est ce que l’ont appel l’identifiant de session. A chaque fois qu’un visiteur affiche une page, il fournis son identifiant de session, et PHP récupère les données correspondantes. Cet identifiant de session est passé en valeur d’une variable, que l’ont appelle nom de session. Par défaut ce nom de session vaut : ‘PHPSESSID’. Ce nom de session est également utilisé pour le nom du cookie, si l’identifiant de session est stocké par cookie.
Il devient donc évident que pour avoir une session partagé, il suffit de ne pas utiliser un hypothétique identifiant de session fournis par le visiteur, mais de forcer PHP à utiliser la même valeur pour tout le monde. Pour cela il est possible d’utiliser la fonction session_id([new_id]) qui permet, si on le lui passe en paramètre, de définir l’identifiant de session à utiliser.
Note : le gestionnaire de sessions par défaut, n’accepte que les caractères dans les intervalles 0-9, a-z, A-Z .
En définissant l’identifiant de session manuellement, il existe un risque de prendre l’identifiant d’une autre session, non partagé et généré par PHP. Pour éviter cela il suffit de définir un identifiant qui ne fait pas la même taille que ceux généré par PHP, par défaut 32 caractères.
Également, l’utilisation de session_id([new_id]) pour définir l’identifiant, force l’envoi d’un nouveau cookie ( si il sont utilisés pour stocker l’identifiant ). Ce qui veux dire que si vous utilisez également des sessions normales, le cookie de cette session sera écrasé, il est donc fortement conseillé a partir du moment ou vous utilisez session_id([new_id]), de définir également un nom de session différent via session_name([new_name]).
Les fonctions session_name([new_name]) et session_id([new_id]) doivent être utilisées avant l’appel à session_start().
L’utilisation de sessions privé et partagé au sein d’une même page n’est pas possible au premier abord, puisqu’on ne peux ouvrir qu’une session à la fois, et il est obligatoire de le faire avant toute écriture dans la page.
Une solution consiste à ouvrir une des deux sessions, récupérer son contenu, la fermer avec session_write_close() et d’ouvrir la seconde. La première session ouverte sera donc en lecture seule et la deuxieme en lecture/écriture.
Edit : Une deuxième solution consiste à utiliser la première session normalement, et d’utiliser la deuxième session dans des fichiers différents, de manière normale également, puis d’utiliser les fichier avec la deuxième session via AJAX. J’en convient c’est plus une astuce qu’une solution, et ne s’adaptera pas à tous les cas, mais comme dis en début d’article, une session partagé répond à des besoins bien précis.
N’oubliez pas également qu’une session collective est une ressource critique, et que l’écriture réel dans le fichier de session ne se fera qu’à la fermeture de la session. Pour que d’autre personne ai accès au contenu le plus récent possible n’oubliez donc pas de fermer votre session aussi tôt que possible.