Les sessions multiples en PHP

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 :

  • un identifiant de session : c'est ce qui identifie de façon unique la session de l'utilisateur. Cet identifiant est sensible, il peut être la source de failles de sécurités, il ne faut pas le diffuser publiquement.
  • une nom de session : c'est le nom du cookie dans lequel on retrouvera l'identifiant de la session.
  • les données : par défaut elles sont stockées dans un fichier unique sur le disque dur à la fin de l'exécution des scripts PHP.

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

Enter your comment
 
 
 

Recent changes RSS feed Valid XHTML 1.0 Valid CSS Driven by DokuWiki