Session PHP expire après 30 minutes : 4 méthodes qui fonctionnent

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : « Pourquoi ma session ne meurt-elle pas ? »

\n\n

Imaginez : vous développez une boutique en ligne, un panneau d'administration ou un espace personnel. L'utilisateur s'est connecté, a travaillé, est parti boire un café — et une heure plus tard, sa session est toujours active. Les données du panier sont conservées, l'accès est ouvert. Ce n'est pas seulement gênant, mais aussi dangereux. Surtout si le site traite des données de paiement.

\n\n

La question « How do I expire a PHP session after 30 minutes? » est l'une des plus populaires sur Stack Overflow (des dizaines de milliers de vues). Et ce n'est pas surprenant : les développeurs débutants pensent souvent qu'il suffit de définir session.gc_maxlifetime — et tout fonctionnera. Puis ils s'étonnent que la session dure des heures.

\n\n

Dans cet article, nous allons examiner 4 approches concrètes pour faire expirer une session PHP exactement après 30 minutes. Vous découvrirez pourquoi les paramètres standard peuvent vous décevoir et quelle méthode choisir selon votre besoin. C'est parti !

\n\n

Un peu de théorie : comment PHP gère la durée de session

\n\n

Avant d'écrire du code, il est important de comprendre deux mécanismes qui influencent la « mort » d'une session :

\n\n
    \n
  • Durée de vie du cookie de session — combien de temps le navigateur conserve l'identifiant de session (PHPSESSID). Géré par le paramètre session.cookie_lifetime.
  • \n
  • Durée de vie des données sur le serveur — combien de temps le fichier de session reste dans le dossier /tmp. Géré par session.gc_maxlifetime.
  • \n
\n\n

Le problème est que le garbage collector (GC) s'exécute de manière probabiliste. Par défaut, il se déclenche dans 1% des requêtes. Cela signifie que même si gc_maxlifetime = 1800 (30 minutes), la session peut encore persister une heure, jusqu'à ce que le GC la traite.

\n\n

C'est pourquoi se fier uniquement au paramètre serveur est une mauvaise idée. Il faut vérifier le temps « manuellement ».

\n\n

Méthode n°1. Classique : vérification du temps dans la session (recommandée)

\n\n

C'est la méthode la plus fiable et la plus transparente. Vous stockez vous-même un horodatage de la dernière activité dans la session, et à chaque requête, vous vérifiez si 30 minutes se sont écoulées.

\n\n
<?php\nsession_start();\n\n// Définit la durée de vie de la session — 30 minutes (1800 secondes)\n$timeout_duration = 1800;\n\n// Si un horodatage existe dans la session et qu'il est expiré\nif (isset($_SESSION['LAST_ACTIVITY']) && \n    (time() - $_SESSION['LAST_ACTIVITY']) > $timeout_duration) {\n    // Détruit la session\n    session_unset();\n    session_destroy();\n    // Redirige vers la page de connexion\n    header("Location: login.php?timeout=1");\n    exit;\n}\n\n// Met à jour l'horodatage (si l'utilisateur est actif)\n$_SESSION['LAST_ACTIVITY'] = time();\n?>
\n\n

Avantages :

\n
    \n
  • Contrôle absolu : la session expire exactement après 30 minutes d'inactivité.
  • \n
  • Ne dépend pas des paramètres PHP ni du garbage collector.
  • \n
  • Facile à modifier la durée pour différentes sections du site (ex. : panneau d'administration — 15 minutes, utilisateur — 60).
  • \n
\n\n

Inconvénients :

\n
    \n
  • Nécessite d'ajouter la vérification sur chaque page (ou de l'externaliser dans un fichier d'initialisation commun).
  • \n
  • Si l'utilisateur garde la page ouverte sans cliquer — la session expire. Pour certains scénarios (formulaire long), c'est un inconvénient.
  • \n
\n\n

Méthode n°2. Combinée : gc_maxlifetime + cookie_lifetime

\n\n

Si vous ne voulez pas écrire de vérification manuelle, vous pouvez essayer de configurer PHP « prêt à l'emploi ». Mais gardez à l'esprit les nuances.

\n\n
// Au début du script, avant session_start()\n$lifetime = 1800; // 30 minutes\n\n// Définit la durée de vie du cookie de session\nsession_set_cookie_params($lifetime);\n\n// Définit la durée de vie maximale des données sur le serveur\nini_set('session.gc_maxlifetime', $lifetime);\n\n// Maintenant, démarre la session\nsession_start();
\n\n

En complément — pour que le GC s'exécute plus souvent, vous pouvez réduire la probabilité de déclenchement :

\n\n
ini_set('session.gc_probability', 1);\nini_set('session.gc_divisor', 1); // Le GC s'exécutera à chaque requête

Blogs

Book Recommendations