Warum Ihre PHP-Session länger lebt als nötig?
Haben Sie sich jemals gefragt, warum Ihre Website sich auch nach 30 Minuten Inaktivität noch an Ihren Login erinnert? Oder beschweren sich Nutzer, dass sie zu früh aus dem System geworfen werden? Die Verwaltung der Session-Lebensdauer in PHP ist einer der häufigsten Kopfschmerzen für Anfänger – und nicht nur für sie. Die Frage "How do I expire a PHP session after 30 minutes?" hat auf Stack Overflow tausende Aufrufe, und das aus gutem Grund.
Lassen Sie uns klären, wie Sie eine PHP-Session nach genau 30 Minuten beenden. Wir betrachten drei Ansätze: vom einfachen (aber tückischen) bis zum professionellen. Sie erfahren, warum session.gc_maxlifetime oft nicht so funktioniert, wie Sie erwarten, und wie Sie zuverlässigen Code schreiben, der nicht enttäuscht.
Das Problem: Was bedeutet "Session-Lebensdauer" eigentlich?
Bevor wir in den Code springen, klären wir die Grundlagen. Eine PHP-Session ist kein Timer im Browser, sondern eine Datei auf dem Server (meist in /tmp/), die Nutzerdaten speichert. Das "Ablaufen" der Session bedeutet, dass diese Datei gelöscht oder ungültig wird.
Drei Schlüsselfaktoren beeinflussen die Lebensdauer:
- Session-Cookie: Der Browser speichert die Session-ID (meist im Cookie
PHPSESSID). Dieses Cookie hat eine eigene Lebensdauer. - Session-Datei auf dem Server: Sie hat einen Zeitstempel der letzten Änderung (mtime).
- Garbage Collector (GC): PHP bereinigt regelmäßig alte Session-Dateien, aber nicht nach einem festen Zeitplan, sondern zufällig.
Genau diese "dreistufige" Architektur führt zu Verwirrung. Nur einen Parameter zu setzen, reicht oft nicht aus.
Methode 1: Naiv – nur session.gc_maxlifetime
Der offensichtlichste Weg, den die Dokumentation vorschlägt, ist session.gc_maxlifetime zu setzen. Das scheint die Antwort auf die Frage "How do I expire a PHP session after 30 minutes?" zu sein. Aber so einfach ist es nicht.
<?php
// Session starten
session_start();
// Session-Lebensdauer in Sekunden (30 Minuten = 1800 Sekunden)
ini_set('session.gc_maxlifetime', 1800);
// Lebensdauer des Session-Cookies ebenfalls auf 30 Minuten setzen
session_set_cookie_params(1800);
// Fertig? Nein.
?>
Warum das nicht funktionieren kann:
- Der Garbage Collector (GC) ist träge. Er wird mit einer Wahrscheinlichkeit von
session.gc_probability/session.gc_divisor(standardmäßig 1/100) ausgelöst. Selbst wenn die Session-Datei eine Stunde alt ist, wird sie beim nächsten Request möglicherweise nicht gelöscht, wenn der GC nicht läuft. - Andere Anwendungen. Wenn auf dem Server mehrere Websites laufen, können diese fremde Sessions löschen – oder Ihre nicht.
- Caching. Bei manchen Hostern (besonders Shared Hosting) werden
ini_set-Einstellungen ignoriert.
Fazit: Diese Methode ist die Basis, aber kein Allheilmittel. Sie funktioniert nur unter idealen Bedingungen. Für den Produktivbetrieb müssen Sie tiefer graben.
Methode 2: Manueller Timer innerhalb der Session (empfohlen)
Dieser Ansatz ist der goldene Mittelweg. Statt auf den Garbage Collector zu hoffen, kontrollieren wir die letzte Aktivität des Nutzers selbst. Das ist die beliebteste Antwort auf Stack Overflow zum Thema PHP-Session nach 30 Minuten beenden.
Die Idee ist einfach: Bei jedem Request prüfen wir, wann der Nutzer zuletzt aktiv war. Wenn mehr als 30 Minuten vergangen sind, zerstören wir die Session.
<?php
session_start();
// Session-Lebensdauer in Sekunden
$session_lifetime = 1800; // 30 Minuten
// Prüfen, ob der Zeitstempel der letzten Aktivität gesetzt ist
if (isset($_SESSION['LAST_ACTIVITY'])) {
// Differenz zur aktuellen Zeit berechnen