Les sessions et les cookies
Notions théoriques
Sessions
Une session est un moyen de stocker des informations pour être accessibles sur plusieurs pages.
Contrairement à un cookie, les sessions ne sont pas stockées sur l'ordinateur de l'utilisateur, mais côté serveur.
Lorsqu'une session est démarrée pour la première fois avec session_start()
, PHP génère un identifiant de session unique.
Cet identifiant est ensuite envoyé au navigateur de l'utilisateur sous la forme d'un cookie.
Lorsque l'utilisateur navigue vers une autre page sur le même site, le navigateur renvoie le cookie contenant l'identifiant de session à PHP.
PHP utilise l'identifiant de session pour retrouver les données de session associées et les rendre disponibles dans la superglobale
$_SESSION
.
Où sont stockées les données de session PHP ?
Les données de session associées à l'identifiant de session sont stockées côté serveur.
1) Stockage des données de session dans des fichiers
Par défaut, PHP stocke les données de session dans des fichiers sur le serveur.
L'emplacement de ces fichiers dépend de la configuration de PHP, mais l'emplacement par défaut est souvent un dossier temporaire, comme /tmp
sur les systèmes Unix/Linux.
Vous pouvez trouver ou modifier l'emplacement où PHP stocke les fichiers de session en cherchant la directive session.save_path
dans le fichier de configuration php.ini
, ou en utilisant la fonction session_save_path()
dans votre script PHP.
Voici comment vous pourriez le faire :
- Pour trouver l’emplacement actuel dans votre script PHP :
echo session_save_path();
- Pour définir un nouvel emplacement :
session_save_path('/chemin/vers/le/nouveau/dossier');
2) Stockage des données de session dans une base de données
Il est possible de configurer le serveur PHP pour qu'il stocke les données de session dans une base de données telles que MySQL, MariaDB, PostgreSQL etc...
3) Stockage des données de session dans un système de cache
Les principaux systèmes de cache, utilisés pour stocker les données de session de PHP son : Redis ou Memcached,
Il est important de s'assurer que l'emplacement de stockage des sessions est bien sécurisé, car les données de session peuvent contenir des informations sensibles.
Il est également important de s'assurer que cet emplacement est accessible en écriture par le processus PHP.
Si les cookies sont désactivés, PHP peut transmettre l'identifiant de session dans l'URL, bien que cette méthode soit généralement évitée en raison de problèmes de sécurité potentiels.
Dans ce cas, l'identifiant de session est ajouté à l'URL de chaque lien ou formulaire sur la page.
Cookies
Un cookie est un petit fichier de données stocké sur l'ordinateur de l'utilisateur.
Les cookies sont généralement utilisés pour conserver la trace des visiteurs et des préférences de l'utilisateur pour une certaine période de temps.
Pour créer un cookie en PHP, on utilise la fonction setcookie()
.
La fonction setcookie()
doit être appelée avant toute sortie HTML.
En PHP, pour récupérer la valeur d'un cookie, on utilise la superglobale $_COOKIE
.
Sessions vs cookies
Il est important de noter que les cookies et les sessions ont des utilisations différentes et complémentaires.
- Les cookies sont idéaux pour stocker des informations non sensibles entre les visites (comme les préférences de l'utilisateur),
- tandis que les sessions sont mieux adaptées pour stocker des informations temporaires qui sont sensibles ou spécifiques à une seule visite (comme les informations d'authentification de l'utilisateur).
- Pour détruire une session en PHP, on utilise
session_destroy()
. - Avant de l'appeler, il faut s'assurer que la session est démarrée avec
session_start()
. - Ensuite, on appelle la fonction
session_destroy()
qui va supprimer toutes les données associées à la session en cours. - Si on veut également supprimer le cookie de session, on doit supprimer le cookie de session avec
setcookie()
.
Comment supprimer un cookie en PHP ?
Pour supprimer un cookie en PHP, il existe 2 approches :
Méthode recommandée : setcookie() avec une date d'expiration passée
La méthode la plus efficace et largement utilisée consiste à utiliser la fonction setcookie()
en définissant une date d'expiration dans le passé :
setcookie("nom_du_cookie", "", time() - 3600);
Cette méthode fonctionne de la manière suivante :
- Elle définit la valeur du cookie à une chaîne vide.
- Elle fixe la date d'expiration à une heure dans le passé (time() - 3600).
- Le navigateur, constatant que la date d'expiration est dépassée, supprimera automatiquement le cookie.
Pour une suppression plus complète, vous pouvez également spécifier le chemin et le domaine si ceux-ci ont été définis lors de la création du cookie :
setcookie("nom_du_cookie", "", time() - 3600, "/", "example.com");
Méthode complémentaire : unset()
Bien que unset()
ne supprime pas réellement le cookie du navigateur, il peut être utile de l'utiliser en complément pour effacer la valeur du cookie de la superglobale $_COOKIE
pour la durée du script en cours :
unset($_COOKIE['nom_du_cookie']);
Bonne pratique
Pour une suppression efficace et complète d'un cookie, il est recommandé de combiner les deux approches :
setcookie("nom_du_cookie", "", time() - 3600, "/");
unset($_COOKIE['nom_du_cookie']);
Cette combinaison assure que le cookie est supprimé du navigateur et que sa valeur n'est plus accessible via $_COOKIE
dans le script en cours d'exécution.
-
Il est important de noter qu'il n'existe pas de fonction native
deleteCookie()
ouunsetCookie()
en PHP. -
La méthode utilisant
setcookie()
avec une date d'expiration passée est la façon standard de supprimer un cookie en PHP.
Quelle est la différence en PHP entre session_close() et session_destroy() ?
En PHP, il existe une différence importante entre session_close()
et session_destroy()
:
session_close()
- Termine la session en cours et sauvegarde les données de session.
- Ne supprime pas les données de session, elles restent disponibles pour une utilisation ultérieure.
- Libère les ressources utilisées par la session.
session_destroy()
- Détruit complètement toutes les données associées à la session en cours.
- Supprime le fichier de session contenant les informations de session.
- Ne désactive pas les variables globales associées à la session ni le cookie de session.
Principales différences :
session_close()
termine simplement la session active, tandis quesession_destroy()
supprime toutes les données de session.- Après
session_close()
, les données de session sont toujours accessibles lors de la prochaine session. - Après
session_destroy()
, toutes les données sont perdues. session_destroy()
est plus radical et généralement utilisé lors d'une déconnexion complète.
Il est important de noter que
session_destroy()
à lui seul ne suffit pas toujours pour une déconnexion complète. Pour une déconnexion totale, il est recommandé d'utiliser une combinaison de fonctions commesession_unset()
,session_destroy()
et de supprimer le cookie de session.
Comment réouvrir une session après un session_close ?
Dans la plupart des cas, un simple appel à session_start()
suffira pour réouvrir la session après un session_close()
.
Si vous voulez éviter les avertissements "headers already sent",
vous pouvez utiliser la fonction session_start()
avec des options spécifiques :
session_start([
'read_and_close' => true
]);
Cette option permet de lire les données de session sans verrouiller le fichier de session, ce qui est utile si vous avez besoin d'accéder aux données de session sans les modifier.
Réouvrir une session ne nécessite pas de renvoyer le cookie de session, car celui-ci est déjà présent dans le navigateur du client.
Exemples pratiques
Session
Créons une session simple en PHP et stockons une information dedans :
<?php
// Démarrage de la session
session_start();
// Stockage d'une information dans la session
$_SESSION["nom"] = "Dupont";
?>
Et maintenant, récupérons cette information dans une autre page :
<?php
// Démarrage de la session
session_start();
// Récupération de l'information stockée dans la session
print("Bonjour, " . $_SESSION["nom"]);
?>
Comment tester ce code ?
Pour tester ce code, il suffir de
- créer 2 fichiers PHP :
- 1 fichier PHP (par exemple
session1.php
) pour créer une session et stocker le nom de l'utilisateur :
<?php
// Démarrage de la session
session_start();
// Stockage d'une information dans la session
$_SESSION["nom"] = "Dupont";
?>
- 1 fichier PHP (par exemple
session2.php
) pour récupérer le nom de l'utilisateur stocké dans la session :
<?php
// Démarrage de la session
session_start();
// Récupération de l'information stockée dans la session
print("Bonjour, " . $_SESSION["nom"]);
?>
-
démarrer le serveur Web intégré à PHP avec la commande
php -S localhost:8000
-
ouvrir la 1ère page avec le navigateur Web :
http://localhost:8000/session1.php
-
ouvrir la 2ème page avec le navigateur Web :
http://localhost:8000/session2.php
-
constater que le nom de l'utilisateur a bien été stocké dans la session
Cookie
Voici comment on peut créer un cookie en PHP :
<?php
// Création d'un cookie qui expire dans une heure
setcookie("couleur_preferee", "bleu", time() + 3600);
?>
Et voici comment le récupérer :
<?php
// Récupération de la valeur du cookie
if(isset($_COOKIE["couleur_preferee"])) {
print("Votre couleur préférée est : " . $_COOKIE["couleur_preferee"]);
}
?>
Comment consulter les informations des cookies ?
Les données des cookies sont stockées dans le navigateur.
Google Chrome
- Ouvrez Google Chrome.
- Cliquez sur les trois points verticaux en haut à droite de la fenêtre du navigateur pour ouvrir le menu.
- Sélectionnez "Plus d'outils", puis "Outils de développement" (ou utilisez le raccourci clavier Ctrl+Shift+I ou la touche F12 sur Windows, ou Command+Option+I sur Mac).
- Dans les outils de développement, cliquez sur l'onglet "Application".
- Dans le volet de gauche, sous "Stockage", cliquez sur "Cookies". Vous verrez une liste des sites Web pour lesquels des cookies sont stockés. Cliquez sur un site Web pour voir les cookies spécifiques à ce site.
Mozilla Firefox
- Ouvrez Mozilla Firefox.
- Cliquez sur les trois lignes horizontales en haut à droite de la fenêtre du navigateur pour ouvrir le menu.
- Sélectionnez "Développement Web", puis "Inspecteur" (ou utilisez le raccourci clavier Ctrl+Shift+C ou la touche F12 sur Windows, ou Command+Option+C sur Mac).
- Dans les outils de développement, cliquez sur l'onglet "Stockage".
- Dans le volet de gauche, sous "Cookies", vous verrez une liste des sites Web pour lesquels des cookies sont stockés. Cliquez sur un site Web pour voir les cookies spécifiques à ce site.
Safari
- Ouvrez Safari.
- Dans la barre de menu en haut de l'écran, cliquez sur "Safari", puis sur "Préférences".
- Dans la fenêtre des préférences, cliquez sur "Confidentialité".
- Cliquez sur "Gérer les données du site Web". Vous verrez une liste des sites Web pour lesquels des données, y compris des cookies, sont stockés.
Comment consulter les informations des sessions ?
Les données de session sont stockées côté serveur, ce qui signifie qu'elles ne sont pas accessibles depuis le navigateur comme les cookies. Cependant, l'ID de session est généralement stocké dans un cookie sur le navigateur de l'utilisateur, ce qui permet au serveur d'associer une session à un utilisateur spécifique.
Pour voir l'ID de session dans votre navigateur, vous pouvez généralement suivre les mêmes étapes que pour voir les cookies, et chercher un cookie dont le nom est : PHPSESSID
(avec PHP). L'ID de session sera la valeur de ce cookie.
Cependant, pour voir les données réelles associées à la session, vous auriez besoin d'accès au serveur. Dans PHP, les données de session sont généralement stockées dans des fichiers sur le serveur. L'emplacement exact de ces fichiers peut varier en fonction de la configuration de votre serveur, mais l'emplacement par défaut est généralement un répertoire appelé tmp
ou session
.
Avec PHP, les données de session sont stockées dans le répertoire spécifié par la directive session.save_path
dans le fichier de configuration php.ini
.
Le chemin par défaut est généralement le répertoire des fichiers temporaires. Sur un système Windows, vous pouvez connaître le chemin de ce répertoire avec la commande echo %TEMP%
Si les données de session sont stockées dans un fichier, son nom commence souvent par sess_
suivi par l'ID de session PHPSESSID
.
Voici par exemple le contenu du fichier sess_2okidihjssr9bv902rjkgfecjb
:
language|s:6:"french";
Veuillez noter que ces fichiers de session sont parfois stockés dans un format sérialisé, donc ils peuvent ne pas être facilement lisibles.
Test de mémorisation/compréhension
TP - Création d'une session
Dans ce TP, vous allez créer une application Web simple qui utilise les sessions pour enregistrer le choix de l'utilisateur concernant la langue du site Web.
Lorsque l'utilisateur sélectionne une langue, cette information est stockée dans une session et utilisée pour afficher le site dans la langue choisie lors de ses visites ultérieures.
- Dans votre répertoire "Documents" créez le répertoire
tp_sessions
. - Dans ce répertoire créez le fichier
index.php
:<!DOCTYPE html>
<html>
<body>
<h2>Choisissez votre langue</h2>
</body>
</html> - Dans ce répertoire créez aussi le fichier
set_language.php
. - Démarrez le serveur Web intégré à PHP :
php -S localhost:8000
- Testez le fonctionnement de ce fichier, dans votre navigateur, à l'adresse :
http://localhost:8000
Étape 1 : Création du formulaire
Dans le fichier index.php
ajoutez un formulaire permettant à l'utilisateur de choisir sa langue préférée. Le formulaire doit avoir deux options : Français et Anglais.
<!DOCTYPE html>
<html>
<body>
<h2>Choisissez votre langue</h2>
<form action="set_language.php" method="post">
<input type="radio" id="french" name="language" value="french">
<label for="french">Français</label><br>
<input type="radio" id="english" name="language" value="english">
<label for="english">Anglais</label><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
Étape 2 : Stockage de la langue dans une session
Dans le fichier set_language.php
- récupèrez la langue choisie par l'utilisateur
- et stockez la dans une session.
<?php
session_start();
if (isset($_POST['language'])) {
$_SESSION['language'] = $_POST['language'];
}
header('Location: index.php');
?>
Étape 3 : Affichage de la langue choisie
Modifiez le fichier index.php
pour qu'il affiche la langue choisie par l'utilisateur s'il y en a une stockée dans la session.
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<h2>Choisissez votre langue</h2>
<form action="set_language.php" method="post">
<input type="radio" id="french" name="language" value="french">
<label for="french">Français</label><br>
<input type="radio" id="english" name="language" value="english">
<label for="english">Anglais</label><br>
<input type="submit" value="Submit">
</form>
<p>
Votre langue actuelle est :
<?php
if (isset($_SESSION['language'])) {
$_SESSION['language'] == 'french' ? 'Français' : 'Anglais';
print($_SESSION['language']);
}
?>
</p>
</body>
</html>
La ligne de code :
$_SESSION['language'] == 'french' ? 'Français' : 'Anglais';
fait appel à l'opérateur ternaire.
Pour en savoir plus : https://www.php.net/manual/fr/language.operators.comparison.php#language.operators.comparison.ternary
Version avec un if
<p>
Votre langue actuelle est :
<?php
if (isset($_SESSION['language'])) {
if ($_SESSION['language'] == 'french') {
print('Français');
}
else {
print('Anglais');
}
}
?>
</p>
Version avec un switch case
Lorsqu'il y a plus de 2 langues, il est conseillé d'utiliser un
switch case
<p>
Votre langue actuelle est :
<?php
if (isset($_SESSION['language'])) {
switch ($_SESSION['language']) {
case 'french':
print('Français');
break;
case 'english':
print('Anglais');
break;
}
}
?>
</p>
Avec ces étapes, vous avez créé une application simple qui utilise les sessions pour mémoriser la préférence de langue de l'utilisateur.
Vous pouvez étendre cette application pour qu'elle affiche réellement le contenu du site dans la langue choisie.
TP - Création d'un cookie
Créez une petite application Web qui permet à un utilisateur de choisir sa couleur préférée.
La couleur choisie par l'utilisateur sera ensuite :
- stockée dans un cookie
- et utilisée pour colorer le fond de la page à chaque visite de l'utilisateur.
-
Dans votre répertoire "Documents" créez le répertoire
tp_cookies
. -
Dans ce répertoire créez le fichier
index.php
:<body>
<h1>Bienvenue sur notre site !</h1>
<p><a href="set_color.php">Choisir une autre couleur</a></p>
</body> -
Dans ce répertoire créez aussi le fichier
set_color.php
. -
Démarrez le serveur Web intégré à PHP :
php -S localhost:8000
-
Testez le fonctionnement de ce fichier, dans votre navigateur, à l'adresse :
http://localhost:8000
-
Dans votre fichier
set_color.php
, créez un formulaire pour que l'utilisateur puisse choisir sa couleur.Pour vous aider voici un exemple possible de formulaire pour le choix de la couleur :
<form method="post">
<label for="couleur">Choisissez votre couleur préférée :</label>
<input type="color" id="couleur" name="couleur">
<button type="submit">Valider</button>
</form> -
Dans votre fichier
index.php
, avant le formulaire HTML, mémoriser la couleur dans la variable$couleur
:<?php
$couleur = "#FFFFFF"; // Couleur par défaut (blanc)
if (isset($_COOKIE["couleur_preferee"])) {
$couleur = $_COOKIE["couleur_preferee"];
}
?> -
Dans votre fichier
index.php
, définissez le stylebackground-color
afin que la couleur choisie soit bien visible.Voici un exemple possible de code pour définir la couleur du fond de la page :
<head>
<style>
body {
background-color: <?php print($couleur); ?>;
}
</style>
</head> -
Testez le fonctionnement de votre projet, dans votre navigateur :
- en cliquant sur le lien "Choisir une autre couleur"
- ou en saisissant l'adresse :
http://localhost:8000/set_color.php
Une solution
Vous devez être connecté pour voir le contenu.