HOWTO · PHP
Définir le délai d'expiration de la session en PHP
Ce tutoriel explique comment mettre en place un délai d’inactivité de 30 minutes pour une session PHP.
Sur cette page
PHP ne met pas automatiquement fin à une session applicative après une durée d’inactivité déterminée. Pour appliquer un délai de 30 minutes, enregistrez l’heure de la dernière requête dans $_SESSION, comparez-la à l’heure actuelle à chaque requête, puis agissez lorsque l’écart atteint ou dépasse 1 800 secondes. Le délai est constaté à la requête suivante, après la période d’inactivité ; le serveur ne peut pas agir au moment où le navigateur cesse d’envoyer des requêtes.
Comment suivre le délai d’inactivité d’une session PHP
Appelez session_start() avant de lire ou de modifier $_SESSION. Lors de la première requête, aucune heure d’activité n’est encore enregistrée : initialisez-la. Lors des requêtes suivantes, comparez l’heure enregistrée à time(). Si la limite de 1 800 secondes est atteinte, effacez les données de session et terminez la requête ; sinon, actualisez l’heure d’activité afin de relancer la période de 30 minutes.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
<?php
session_start();
$timeoutSeconds = 30 * 60;
$now = time();
if (isset($_SESSION['last_activity']) &&
$now - $_SESSION['last_activity'] >= $timeoutSeconds) {
session_unset();
session_destroy();
echo "Session expired" . PHP_EOL;
exit;
}
$_SESSION['last_activity'] = $now;
echo "Session active" . PHP_EOL;
Session active
La première requête initialise last_activity et suit le parcours actif. Chaque requête suivante vérifie l’horodatage précédent avant de le mettre à jour. Les éléments d’exécution fournis indiquent Session active avec un code de sortie 0 pour le parcours actif. Ils ne montrent pas l’exécution du parcours après expiration. Dans une application, placez cette vérification après session_start() et avant les opérations protégées, afin qu’une requête expirée ne soit pas traitée comme authentifiée.
Détruire une session après 30 minutes d’inactivité
Lorsque le délai est écoulé, l’exemple utilise à la fois session_unset() et session_destroy(). session_unset() supprime les variables de la session courante, tandis que session_destroy() supprime les données de session stockées par le gestionnaire de session actif. La suppression des données côté serveur ne supprime pas à elle seule le cookie de session du navigateur. Si l’application doit aussi faire expirer ce cookie, elle doit envoyer un cookie expiré avec les mêmes paramètres de nom, de chemin et de domaine ; sa gestion dépend de la configuration de session de l’application.
Il s’agit d’un délai d’expiration géré par l’application : il ne s’applique que lorsqu’une requête atteint le code qui effectue la vérification. Les paramètres de durée de conservation du stockage de session de PHP régissent le nettoyage des données stockées et sont indépendants de cette règle d’inactivité par requête. Consultez le Manuel PHP pour session_unset() et les options de configuration des sessions.
Supprimer une variable de session avec unset()
Utilisez unset($_SESSION['cart']) pour supprimer une entrée tout en conservant les autres entrées de session. Cette méthode convient lorsqu’un utilisateur retire un élément d’état précis, comme un panier, sans mettre fin à toute la session. À elle seule, elle ne met pas en œuvre un délai d’inactivité. Pour un groupe de valeurs liées, stockez-les sous une clé de tableau et supprimez uniquement cette clé avec unset($_SESSION['account_state']) ; ne remplacez pas le tableau par un horodatage si la vérification ultérieure du délai d’expiration attend un élément registered.
La superglobale $_SESSION est disponible après l’appel à session_start(). Consultez le Manuel PHP pour $_SESSION.
Régénérer un identifiant de session indépendamment de la gestion du délai d’expiration
session_regenerate_id() remplace l’identifiant de session courant ; cette fonction ne mesure pas l’inactivité, ne supprime pas les données de session et n’oblige pas automatiquement l’utilisateur à se reconnecter. Utilisez-la pour appliquer une politique de rotation des identifiants au moment approprié du parcours d’authentification de l’application, indépendamment de la vérification du délai d’expiration. La conservation des anciennes données de session dépend des options de la fonction et de la gestion des sessions ; ne considérez donc pas la seule régénération comme une déconnexion ni comme la preuve que l’ancien identifiant est inutilisable.
La fonction session_id() lit l’identifiant courant, tandis que session_start() reprend la session associée à la requête. Pour en savoir plus, consultez le Manuel PHP sur session_regenerate_id() et la fonction session_id().