Fusion de sessions PHP

Décembre 2016

Les sessions PHP sont souvent utilisées pour gérer une section membre d'un site. Il est possible d'ouvrir un même compte utilisateur sur plusieurs ordinateurs. Cependant, chaque ordinateur aura sa session (la session est un cookie : un tracer envoyé à votre navigateur internet). Le code ci dessous est une "démonstration de fonctionnement", certains ajustements quant à l'authentification doivent bien sur être effectués lors de l'implémentation.

Pour certaines utilisations, il peut être intéressant d'utiliser une session commune à plusieurs ordinateurs. C'est ce que je vous propose d'étudier.


Le fonctionnement des sessions


Les variables enregistrées dans $_SESSION[] sont enregistrées sur le serveur WEB par la librairie PHP. Le dossier contenant les fichiers de session est spécifié dans le fichier php.ini (un fichier très intéressant). Son nom est session.save_path et sa valeur par défaut est "/tmp". Pour lier ce fichier au navigateur du client, un identifiant lui est envoyé sur la page faisant un session_start() si aucun cookie n'est déjà spécifié. Lors de la demande de chaque nouvelle page, le cookie est renvoyé au serveur, qui identifiera la session concernée et chargera $_SESSION en fonction.
Le nom de ce cookie est lui aussi spécifié dans le php.ini. Le nom est session.name et sa valeur par défaut est PHPSESSID.

Le principe de la fusion


Comme vous l'avez compris, le site ne repère une session qu'à la valeur du cookie passé par le client. Si deux navigateurs internet présentent le même cookie de session, alors ces deux navigateurs partageront un tableau $_SESSION[].

Pour cela, il faut que la personne, ayant initialisé la session en premier, donne son identifiant de session aux personnes voulant s'y connecter. Il faut donc prévoir un affichage de la valeur du cookie de session

La personne voulant se connecter devra utiliser un formulaire spécifique, dans lequel il passera la valeur de la session à communiquer. Lors du traitement du formulaire, on enverra cette valeur dans un cookie de session que nous aurons fabriqués nous mêmes.

Les deux navigateurs auront ensuite une session commune.

Code PHP


Nom du cookie de session


Le nom du cookie de session se récupère via l'instruction ini_get('session.name').

Envoi du cookie "home made"


L'envoi du cookie se fait via l'instruction setcookie(ini_get('session.name'),'valeur');

Lecture de la valeur du cookie de session


La lecture de la valeur du cookie de session se fera via la variable $_COOKIE[ini_get('session.name')]

Ouverture de session traditionnelle


<?php
session_start();
echo "php: ".ini_get('session.name').'<br />';
if (isset($_COOKIE[ini_get('session.name')]))
{
	echo "cookie: ".$_COOKIE[ini_get('session.name')];
	$_SESSION['test']="OK!";
}
else
	header('Location: login.php');
?>

Formulaire de fusion


<?php
if (isset($_GET['cookie']))        //si le forumaire a été rempli
{
    //génération du cookie de liason de session
    setcookie(ini_get('session.name'),$_GET['cookie']);    
    //page de validation
    echo '<html><body><a href="validation.php">validation '
            .$_GET['cookie'].'</a></body></html>';
}
else
{
    //forulaire de fusion
    echo '<html><body><form action="">
            <input name="cookie"/><input type="submit" />
            </form></body></html>';
}
?>

Validation.php


<?php
session_start();
echo "cookie: ".$_COOKIE[ini_get('session.name')]."<br/>";
echo "test: ";
if (isset($_SESSION['test']))    //si la variable de session existe
   echo $_SESSION['test'];        //on l'affiche
else                            //sinon
   echo "PAS BON";                //on s'est planté comme des grosses buses
?>

Essais


Maintenant, vous pouvez créer vos 3 fichiers dans le même répertoire. Le nom du 3° fichier est celui défini dans le lien du 2° (validation.php)
Lancez le premier fichier, copiez la valeur de la variable de session.
Dans un autre navigateur (pas une autre fenêtre), ouvrez le 2° fichier. Collez la valeur de la variable de session dans le formulaire, et validez.
La 3° page vous affiche dans le deuxième navigateur la valeur qui avait été définie dans le premier navigateur!
Si vous refaites l'essai en spécifiant une valeur erronée, la variable ne s'affiche pas.

inconvénients


Certains sites enregistrent dans la session certaines valeurs de cheminement de l'utilisateur dans le site. Cette utilisation des variables de session peut être problématique.

avantages


Vous pouvez interrompre votre session sur un ordinateur, et reprendre exactement là où vous en étiez, sur un autre ordinateur, sans utiliser de base de données.
Sur un site de shopping par exemple, plusieurs utilisateurs peuvent utiliser un "caddie" (comme un panier, mais collectif!).

A voir également :

Ce document intitulé «  Fusion de sessions PHP  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.