PHP-Sitzung läuft nach 30 Minuten ab: 4 funktionierende Methoden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: „Warum stirbt meine Sitzung nicht?“

\n\n

Stellen Sie sich vor: Sie programmieren einen Online-Shop, ein Admin-Panel oder ein Benutzerkonto. Der Benutzer loggt sich ein, arbeitet, geht Kaffee trinken – und eine Stunde später ist seine Sitzung immer noch aktiv. Die Daten im Warenkorb hängen, der Zugriff ist offen. Das ist nicht nur unpraktisch, sondern auch gefährlich. Besonders wenn die Website mit Zahlungsdaten arbeitet.

\n\n

Die Frage „How do I expire a PHP session after 30 minutes?“ ist eine der beliebtesten auf Stack Overflow (Zehntausende von Aufrufen). Und das ist kein Wunder: Anfänger denken oft, es reiche aus, session.gc_maxlifetime zu setzen – und alles funktioniert. Und dann wundern sie sich, warum die Sitzung stundenlang lebt.

\n\n

In diesem Artikel behandeln wir 4 reale Ansätze, wie Sie eine PHP-Sitzung nach genau 30 Minuten ablaufen lassen. Sie erfahren, warum die Standardeinstellungen versagen können und welche Methode Sie für Ihre Aufgabe wählen sollten. Los geht's!

\n\n

Ein wenig Theorie: Wie PHP die Sitzungszeit verwaltet

\n\n

Bevor wir Code schreiben, ist es wichtig, zwei Mechanismen zu verstehen, die den „Tod“ einer Sitzung beeinflussen:

\n\n
    \n
  • Lebensdauer des Session-Cookies – wie lange der Browser die Sitzungs-ID (PHPSESSID) speichert. Wird durch den Parameter session.cookie_lifetime gesteuert.
  • \n
  • Lebensdauer der Daten auf dem Server – wie lange die Sitzungsdatei im Ordner /tmp liegt. Wird durch session.gc_maxlifetime gesteuert.
  • \n
\n\n

Das Problem ist, dass der Garbage Collector (GC) probabilistisch ausgeführt wird. Standardmäßig wird er bei 1% der Anfragen ausgelöst. Das bedeutet, selbst wenn gc_maxlifetime = 1800 (30 Minuten) ist, kann die Sitzung noch eine Stunde hängen, bis der GC sie erreicht.

\n\n

Daher ist es eine schlechte Idee, sich nur auf die Servereinstellung zu verlassen. Man muss die Zeit „manuell“ überprüfen.

\n\n

Methode Nr. 1. Klassisch: Zeitstempel in der Sitzung prüfen (empfohlen)

\n\n

Dies ist die zuverlässigste und transparenteste Methode. Sie speichern selbst einen Zeitstempel der letzten Aktivität in der Sitzung und prüfen bei jeder Anfrage, ob 30 Minuten vergangen sind.

\n\n
<?php\nsession_start();\n\n// Setzen der Sitzungslebensdauer – 30 Minuten (1800 Sekunden)\n$timeout_duration = 1800;\n\n// Wenn ein Zeitstempel in der Sitzung existiert und abgelaufen ist\nif (isset($_SESSION['LAST_ACTIVITY']) && \n    (time() - $_SESSION['LAST_ACTIVITY']) > $timeout_duration) {\n    // Sitzung zerstören\n    session_unset();\n    session_destroy();\n    // Zur Login-Seite umleiten\n    header("Location: login.php?timeout=1");\n    exit;\n}\n\n// Zeitstempel aktualisieren (wenn der Benutzer aktiv ist)\n$_SESSION['LAST_ACTIVITY'] = time();\n?>
\n\n

Vorteile:

\n
    \n
  • Absolute Kontrolle: Die Sitzung stirbt genau nach 30 Minuten Inaktivität.
  • \n
  • Unabhängig von PHP-Einstellungen und dem Garbage Collector.
  • \n
  • Einfach die Zeit für verschiedene Bereiche der Website änderbar (z. B. Admin-Panel – 15 Minuten, Benutzer – 60).
  • \n
\n\n

Nachteile:

\n
    \n
  • Die Prüfung muss auf jeder Seite hinzugefügt werden (oder in eine gemeinsame Initialisierungsdatei ausgelagert werden).
  • \n
  • Wenn der Benutzer eine Seite offen hält, aber nicht klickt – stirbt die Sitzung. Für einige Szenarien (langes Formular) ist das ein Nachteil.
  • \n
\n\n

Methode Nr. 2. Kombiniert: gc_maxlifetime + cookie_lifetime

\n\n

Wenn Sie keine manuelle Prüfung schreiben möchten, können Sie versuchen, PHP „out of the box“ zu konfigurieren. Aber denken Sie an die Nuancen.

\n\n
// Am Anfang des Skripts, vor session_start()\n$lifetime = 1800; // 30 Minuten\n\n// Lebensdauer des Session-Cookies setzen\nsession_set_cookie_params($lifetime);\n\n// Maximale Lebensdauer der Daten auf dem Server setzen\nini_set('session.gc_maxlifetime', $lifetime);\n\n// Jetzt die Sitzung starten\nsession_start();
\n\n

Zusätzlich – damit der GC häufiger läuft, kann die Auslösewahrscheinlichkeit verringert werden:

\n\n
ini_set('session.gc_probability', 1);\nini_set('session.gc_divisor', 1); // GC wird bei jeder Anfrage ausgelöst

Blogs

Buchempfehlungen