Voici une méthode permettant de faire cohabiter et communiquer deux sessions (ou plus) en PHP. Ceci peut vous être utile si vous avez plusieurs applications Web hébergées sur le même domaine et que vous désirez les faire communiquer entre elles via leurs sessions PHP.
Pour rappel, une session PHP est constituée de :
Faire cohabiter plusieurs sessions PHP consiste donc à faire cohabiter plusieurs cookies de session et donc à gérer plusieurs noms de sessions.
Tout d'abord, ce premier script très simple va créer une session ayant pour nom "SESSION1" avec pour contenu la clé/valeur "data" et le timestamp du moment :
<?php session_name('SESSION1'); session_start(); $_SESSION['data'] = time(); var_dump($_SESSION['data'], session_id());
L'exécution de ce script devrait donner quelque chose comme ça :
int 1271526946 string '6da12c25c44ef378e9d276a91f19f748' (length=32)
Le premier chiffre (integer) correspond au timestamp et la chaîne de caractère correspond à l'identifient de session.
Remarque : la session est nommée à l'aide de la fonction session_name(…)
. Si on omet ceci, le nom de la sessions sera celui indiqué dans la configuration php.ini
du serveur Web.
Créons maintenant un second script qui aura pour objectif d'afficher le contenu de la session ayant pour nom "SESSION2" :
<?php session_name('SESSION2'); session_start(); var_dump($_SESSION['data'], session_id());
Exécutons le, il retourne quelque chose comme ça :
null string '30d7f2f8c00b9929a740d0516b1664b9' (length=32)
Ceci est tout à fait normal car l'exécution de ce script a simplement provoqué la création de la session nommée "SESSION2" mais elle reste vide pour le moment.
Nous allons maintenant écrire un script dont le but sera de transférer le contenu de "SESSION1" vers "SESSION2". Ceci nécessite l'ouverture des deux sessions dans le même script PHP, c'est maintenant que ça ce complique un peu :
<?php session_name('SESSION1'); session_start(); $data = $_SESSION['data']; session_write_close(); session_name('SESSION2'); session_start(); session_regenerate_id(); $_SESSION['data'] = $data;
On commence par ouvrir "SESSION1", on récupère son contenu puis on la ferme à l'aide de session_write_close()
. Ensuite on ouvre "SESSION2" et on lui copie les données précédemment récupérées depuis "SESSION1". Une étape importante est la régénération de l'identifiant de "SESSION2" via la méthode session_regenerate_id()
. Sans cette étape, l'identifiant de session de "SESSION2" deviendrait le même que celui de "SESSION1" ce qui serait très embêtant car on perdrait alors l'indépendance entre ces deux sessions.
On exécute ce script puis on s'assurer que le contenu de "SESSION2" est bien le bon en reexécutant le script précédent. Il devrait retourner quelque chose comme ça :
int 1271526946 string 'e47ccd849fe778ca4cc59688ae73281c' (length=32)
On remarque que le timestamp est le même que dans "SESSION1". Par contre on remarque que l'identifiant de sessions a changé mais ceci est normal car c'est la conséquence de l'appel à session_regenerate_id()
. Ceci n'est pas très optimisé mais on conserve l'essentiel : l'identifiant de "SESSION1" reste différent de celui de "SESSION2".
On peut maintenant effacer le contenu de "SESSION1" à l'aide ce ce script :
<?php session_name('SESSION1'); session_start(); session_destroy();
On constatera que ceci n'a aucun impacte sur le contenu de "SESSION2". Les deux sessions restent bien indépendantes et "SESSION2" a récupéré les données contenues dans "SESSION1".
Objectif atteint !
Discussion