Les Sessions en PHP

Photo de Tamas Pap sur Unsplash.
Introduction
Lors d'une quête précédente, tu as découvert comment faire transiter des informations d'une page à une autre en utilisant les méthodes GET et POST de la requête HTTP. Ces deux méthodes offrent des caractéristiques intéressantes dans le cadre d’une communication client/serveur comme en contexte de soumission de formulaire par exemple. Côté serveur, tu as également appris à vérifier et traiter la donnée de l’utilisateur puis la sauvegarder en base de données le cas échéant.
Mais en projet web, il n’est pas toujours nécessaire de stocker de manière prolongée les informations de l’utilisateur. Une sauvegarde temporaire peut parfois suffire.
Dans cette quête, nous allons voir quels peuvent être ces cas de figure et comment y répondre en utilisant les sessions PHP.
🤓 À la fin de cette quête, tu seras capable de :
- ✅ Connaître le principe des Sessions
- ✅ Savoir les utiliser
- ✅ Manipuler une nouvelle super globale :
$_SESSION
Sommaire
Les sessions en PHP : le concept
Disponibles depuis la version 4 de PHP, les sessions sont un mécanisme mis en place pour persister l'état des données d'un utilisateur entre différentes requêtes HTTP. Autrement dit, elles résolvent le problème de maintenir l'état dans un environnement web qui est par nature sans état. Sans état, cela signifie que d’une requête à l’autre, le serveur n’a pas connaissance de la requête précédente. Chaque requête, est « nouvelle » en quelque sorte, peu importe qu’elle soit effectuée par un même utilisateur ou non. Or, il n’est pas rare que les contenus et l’affichage d’un site Internet soient adaptés à l’utilisateur au cours de sa navigation ou en fonction de ses préférences. Cela peut même faire l’objet du service principal du site. Il devient alors nécessaire d'identifier l'utilisateur tout au long de sa visite. Voici quelques exemples et cas de figure :
- Gestion d’un panier d’achat
- Accès à un espace sécurisé (espace membre, compte client…)
- Quiz ou formulaires sur plusieurs pages
- Préférences d’affichage (thème, langue…)
- Message de validation ou d’erreur personnalisé après une redirection serveur
- Et bien d'autres…
Regardons comment gérer un tel mécanisme.
Activer et utiliser les Sessions
Mettre en place un système de stockage en session avec PHP est relativement simple. Voici les principales étapes.
- 1
Démarrage
Le mécanisme de Session n’est pas activée automatiquement par PHP (à moins de l’avoir configuré via le
php.ini, ce qui n’est pas conseillé). Pour le démarrer, il faut prendre soin d’ajouter au début de chaque fichier la commandesession_start():php<?php // Démarrage de la session session_start();Pour des raisons pratiques, il est courant d’ajouter cette commande dans un fichier qui sera
includeen tête de tous les autres pour éviter d’avoir à répéter la commande.Si tu utilises l'auto-chargement de classe (comme avec Composer par exemple), il est conseillé de placer la commande après l’appel du fichier d’autoloading. Cela te permettra de pouvoir stocker en Session des instances de classe qui seront correctement identifiées par l’application.
php<?php require_once __DIR__ . '/../vendor/autoload.php'; session_start(); - 2
Enregistrer en Session
Pour stocker des informations en Session, PHP met à disposition la variable superglobale
$_SESSION. Comme toutes les superglobales, il s’agit d’un espace mémoire de type array. Tu vas donc pouvoir exploiter les index de$_SESSION, puisque c'est un tableau, pour y stocker des informations. Et dans un tableau, on peut mettre tous types de valeurs (string, integer, array, object…). Voici un exemple pour stocker des informations sur l’utilisateur :php// Stockage de données dans la session $_SESSION['username'] = 'John Doe'; $_SESSION['email'] = 'john.doe@example.com'; - 3
Lire une Session
Là encore rien de plus simple. Un tableau reste un tableau. Il suffit de nommer les index comme ceci par exemple :
php// Récupération des données de session echo "Nom d'utilisateur : " . $_SESSION['username'] . "<br>"; echo "Email : " . $_SESSION['email']; - 4
Suppression
Lorsqu’une information n’est plus utile en Session, il est conseillé de libérer l’espace alloué en supprimant l’index grâce à la fonction
unset(). Ce principe de suppression sera également utilisé pour déconnecter un utilisateur, retirer un élément d'un panier d'achat, réinitialiser des préférences… Voici un exemple pour supprimer l'identification par le nom de l'utilisateur :php<?php if (!empty($_GET['logout']) { //déconnexion de l'utilisateur unset($_SESSION['username']); header('Location: /'); exit(); } - 5
Précautions
- Les Sessions sont utiles pour stocker des informations éphémères. Par défaut, la durée de vie d’une session est de 24 minutes. Là aussi, cette valeur peut être modifiée via le fichier
php.ini. Si l’utilisateur est inactif pendant cette période, la Session qui lui est associée est supprimée côté serveur. - Il est conseillé d’éviter de stocker des données sensibles (mots de passe en clair par exemple), pour éviter toute erreur de manipulation et donc, de divulgation.
- Éviter également d’y stocker trop d’informations pour ne pas encombrer inutilement la mémoire du serveur et dégrader de fait les performances.
- Les Sessions sont utiles pour stocker des informations éphémères. Par défaut, la durée de vie d’une session est de 24 minutes. Là aussi, cette valeur peut être modifiée via le fichier
Comment le serveur identifie chaque utilisateur ?
Pour que le mécanisme de Session utilisateur puisse fonctionner, le serveur PHP va avoir besoin d’un complice qui jouera le rôle de « relai » dans le navigateur de l’utilisateur. Tu en as sûrement déjà entendu parlé, il va s’agir d’un Cookie 🍪.
Dans le cas d’un serveur PHP, lorsqu'un utilisateur accède à un fichier, la fonction session_start() génère automatiquement un identifiant de session unique pour cet utilisateur. Cet identifiant (composé d'une suite de chiffres et de lettres) est ensuite stocké dans un cookie, sur le navigateur de l'utilisateur. Par défaut, le nom de ce cookie est PHPSESSID .
Ensuite, à chaque requête HTTP suivante, le cookie contenant l'identifiant de session est automatiquement envoyé par le navigateur. Cela permet au serveur PHP de reconnaître l'utilisateur et de pouvoir ainsi restaurer les données de session associées.
Voici un petit diagramme qui présente ce mécanisme.
Législation
En tant que développeur de sites internet, tu vas être soumis à quelques contraintes, notamment sur la conservation des données de l'utilisateur. Tu n'as pas le droit de conserver tout ce dont tu as envie à propos de tes visiteurs. Tu dois suivre les règles imposées par le Règlement Général sur la Protection des Données (RGPD) et contrôlées par la Commission Nationale de l'Informatique et des Libertés (CNIL).
Attention, un simple cookie de session utilisé pour gérer l'authentification à un site ne nécessite pas le consentement de l'utilisateur.
Tu l'as compris, les cookies vont te permettre de conserver des informations relatives à l'utilisateur, directement sur son ordinateur. À la différence des données stockées en session, ces dernières ne seront pas supprimées lors de la destruction de la session. Ces données sont simplement stockées dans un fichier texte, sous la forme d'un ensemble clé/valeur.
Aller plus loin
N'hésite pas à consulter cette ressource qui intègre d'autres explications concernant les sessions en PHP.
Cette quête te permettra aussi d'en apprendre plus sur le RGPD.
- Quête 2944 (hors archive)
Quiz
false|||false|||true
# Les données de session sont stockées...
[] Sur l'ordinateur du visiteur
[x] Côté serveur
# Quel appel de fonction permet de démarrer une session ?
[x] session_start()
[] session_init()
# Les cookies sont stockés...
[x] Sur l'ordinateur du visiteur
[] Côté serveur
# Comment stocker le nom de l'utilisateur en session ?
[] setsession("name", "John")
[x] $_SESSION["name"] = "John"
# Comment afficher le nom de l'utilisateur stocké en session ?
[] echo getsession("name")
[x] echo $_SESSION["name"]
# Quel appel de fonction permet de supprimer le nom de l'utilisateur en session ?
[] session_unset("name")
[x] unset($_SESSION["name"])
Challenge
Reprenons la quête fil rouge Welcome on board.
Pour rappel, sur ce projet tu as déjà réalisé :
- l'intégration de la maquette HTML/CSSQuêtes liées
- toutes les étapes de vérifications, validation et redirection avec affichage des erreurs.Quêtes liées

Faisons maintenant en sorte de personnaliser le message affiché à l'utilisateur après soumission du formulaire en utilisant le mécanisme de session PHP.
- Si tu souhaites repartir d'un code propre qui intègre la correction précédente, crée une copie de ce dépôt en utilisant le bouton Use this template. Github te propose de créer un nouveau dépôt sur ton compte que tu pourras ensuite cloner sur ton ordinateur.
- Dans le fichier
index.phpaccompli les tâches mentionnées à l'aide des commentaires @todo, à savoir :- démarrer une session PHP en début de fichier,
- enregistrer les données du formulaire en session après vérification des données et juste avant la redirection.
- Dans le fichier
result.php, tu trouveras aussi des mentions @todo t'indiquant ce que tu dois réaliser :- démarrer une session PHP en début de fichier,
- personnaliser le message pour qu'il ressemble au modèle ci-dessous :
Thank you for your message !
Your message is being processed.
Our team will get back to you within 48 hours at
Have a nice day and see you soon 🙂
You've contacted us for
- Subject:
- Message:
Lorsque tu as terminé, effectue un commit et un push et poste le lien de ton dépôt en guise de solution.
Critères de validation
- Les informations de l'utilisateur sont stockées en session uniquement s'il n'y a pas d'erreurs lors des étapes de validation du formulaire.
- La page de redirection affiche le message avec les données de l'utilisateur (nom, email, sujet et message).
==$==
Une solution possible
Fichier index.php
//@todo start PHP session
session_start();
$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$contact = array_map('trim', $_POST);
if (empty($contact['name'])) {
$errors[] = 'Name is required';
}
if (empty($contact['email'])) {
$errors[] = 'Email is required';
}
if (filter_var($contact['email'], FILTER_VALIDATE_EMAIL) === false) {
$errors[] = 'Email is not valid';
}
if (empty($contact['subject'])) {
$errors[] = 'Please choose a subject in the list';
}
if (empty($errors)) {
//@todo save contact form data to session
$_SESSION['contact'] = $contact;
header('Location: result.php');
exit();
}
}
Fichier result.php
<?php session_start(); ?>
<!DOCTYPE html>
//...
<h1>Thank you for your message <?=$_SESSION['contact']['name']?>!</h1>
<p>
Your message is being processed.
<br>
Our team will get back to you within 48 hours at <?=$_SESSION['contact']['email']?>.
</p>
<p>
Have a nice day and see you soon 🙂
</p>
<h2>You've contacted us for</h2>
<ul>
<li><strong>Subject</strong>: <?=$_SESSION['contact']['subject']?></li>
<li><strong>Message</strong>: <?=$_SESSION['contact']['message']?></li>
</ul>
À noter : la variable superglobale PHP $_SESSION étant un tableau, elle peut tout à fait contenir d'autres tableaux, ce qui ferait d'elle un tableau multidimensionnel.
Cela peut s'avérer pratique pour organiser les données qui y sont stockées.