HOWTO · PHP
Sitzungs-Timeout in PHP festlegen
Dieses Tutorial zeigt, wie Sie in PHP ein 30-minütiges Inaktivitäts-Timeout umsetzen, indem Sie die Zeit seit der letzten Anfrage erfassen und prüfen.
Auf dieser Seite
PHP beendet eine Anwendungssitzung nicht automatisch nach einer festgelegten Inaktivitätsdauer. Um ein Timeout von 30 Minuten durchzusetzen, speichern Sie den Zeitpunkt der letzten Anfrage in $_SESSION, vergleichen ihn bei jeder Anfrage mit der aktuellen Zeit und reagieren, sobald die Differenz mindestens 1.800 Sekunden beträgt. Das Timeout wird erst bei der nächsten Anfrage nach der Leerlaufzeit erkannt; der Server kann nicht in dem Moment reagieren, in dem ein Browser keine Anfragen mehr sendet.
Ein Sitzungs-Timeout für PHP überwachen
Rufen Sie session_start() auf, bevor Sie $_SESSION auslesen oder ändern. Bei der ersten Anfrage ist noch keine Aktivitätszeit gespeichert; initialisieren Sie sie daher. Vergleichen Sie bei späteren Anfragen den gespeicherten Zeitpunkt mit time(). Sobald die Grenze von 1.800 Sekunden erreicht ist, löschen Sie die Sitzungsdaten und beenden die Anfrage. Andernfalls aktualisieren Sie die Aktivitätszeit, damit der Zeitraum von 30 Minuten erneut beginnt.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
<?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
Bei der ersten Anfrage wird last_activity initialisiert und der aktive Pfad durchlaufen. Bei jeder weiteren Anfrage wird der vorherige Zeitstempel geprüft, bevor er aktualisiert wird. Die bereitgestellten Ausführungsdaten melden für den aktiven Pfad Session active und den Exit-Code 0. Sie zeigen keine Ausführung des abgelaufenen Pfads. Platzieren Sie diese Prüfung in einer Anwendung nach session_start() und vor geschützten Aktionen, damit eine abgelaufene Anfrage nicht als authentifiziert verarbeitet wird.
Eine Sitzung nach 30 Minuten Inaktivität beenden
Wenn das Timeout abgelaufen ist, verwendet das Beispiel sowohl session_unset() als auch session_destroy(). session_unset() entfernt die aktuellen Sitzungsvariablen, während session_destroy() die Sitzungsdaten entfernt, die vom aktiven Session-Handler gespeichert wurden. Das Löschen serverseitiger Daten entfernt das Session-Cookie im Browser nicht automatisch. Soll auch dieses Cookie ablaufen, muss die Anwendung ein abgelaufenes Cookie mit denselben Einstellungen für Name, Pfad und Domain senden. Wie Cookies behandelt werden, hängt von der Session-Konfiguration der Anwendung ab.
Dies ist ein Timeout auf Anwendungsebene: Es greift nur, wenn eine Anfrage den Code erreicht, der die Prüfung ausführt. Die Einstellungen von PHP zur Speicherdauer der Sitzung steuern die Bereinigung gespeicherter Daten und sind von dieser Inaktivitätsregel pro Anfrage getrennt. Weitere Informationen finden Sie im PHP-Handbuch zu session_unset() und in den Konfigurationsoptionen für Sessions.
Eine Sitzungsvariable mit unset() entfernen
Mit unset($_SESSION['cart']) entfernen Sie einen einzelnen Eintrag, während die übrigen Sitzungseinträge verfügbar bleiben. Das eignet sich, wenn ein Benutzer einen bestimmten Zustand, etwa den Warenkorb, entfernen möchte, ohne die gesamte Sitzung zu beenden. Für sich allein implementiert dies kein Inaktivitäts-Timeout. Speichern Sie zusammengehörige Werte unter einem Array-Schlüssel und entfernen Sie nur diesen Schlüssel mit unset($_SESSION['account_state']). Ersetzen Sie das Array nicht durch einen Zeitstempel, wenn die spätere Timeout-Prüfung ein Element namens registered erwartet.
Das Superglobal $_SESSION ist nach session_start() verfügbar. Weitere Informationen finden Sie im PHP-Handbuch zu $_SESSION.
Eine Sitzungs-ID unabhängig von der Timeout-Behandlung erneuern
session_regenerate_id() ersetzt die aktuelle Sitzungskennung. Die Funktion misst weder die Inaktivität noch zerstört sie Sitzungsdaten oder verlangt automatisch, dass sich der Benutzer erneut anmeldet. Verwenden Sie sie unabhängig von der Timeout-Prüfung für eine Richtlinie zur Erneuerung der Kennung, und zwar an einer passenden Stelle im Authentifizierungsablauf der Anwendung. Ob alte Sitzungsdaten erhalten bleiben, hängt von den Optionen der Funktion und der Session-Verarbeitung ab. Betrachten Sie die Erneuerung daher allein weder als Abmeldung noch als Beleg dafür, dass eine vorherige Kennung nicht mehr verwendbar ist.
Die Funktion session_id() liest die aktuelle Kennung aus, während session_start() die mit der Anfrage verbundene Sitzung wieder aufnimmt. Einzelheiten finden Sie im PHP-Handbuch zu session_regenerate_id() und zur Funktion session_id().