Löschen verwaister Sessiondateien
Wenn ein PHP-Script nicht über einen "Logout"-Mechanismus verfügt, oder es nie zu der Ausführung eines solchen Mechanismus kommt, weil ein imaginärer Benutzer den imaginären "Logout"-Button nicht gedrückt hat und man nicht mit session_destroy() reagieren kann, werden ältere und verwaiste Sessiondateien bei dem chronologisch nächsten Request bzw. Initialisierung der Session (session_start() resp. session_register()) gelöscht.
Die Initialisierung der Session setzt zuerst einen Prozeß in Gang, den man Garbage Collection (gc) nennt, und der dafür sorgt, dass alle verwaisten Sessiondateien aus dem Filesystem entfernt werden - erst danach wird ggf. eine neue Sessiondatei angelegt.
Um zu bestimmen, ob eine Sessiondatei verwaist ist, stellt PHP 4 den Konfigurationsparameter session.gc_maxlifetime in der php.ini bereit.
Der nummerische Wert von session.gc_maxlifetime gibt an, nach wievielen Sekunden eine Sessiondatei als Müll angesehen wird und entfernt werden darf (Default: 1440 Sekunden = 24 Minuten). Wenn die Differenz aus der Initialisierungszeit der Session (Jetzt-Zeit aus der Sicht des Scripes) und dem letzten Zugriff auf eine oder mehrere Sessiondateien den session.gc_maxlifetime-Wert übersteigt, werden diese Dateien gelöscht.
In der PHP 4-Defaulteinstellung wird die Garbage Collection statistisch jedoch nur bei jedem hundertsten session_start() angestoßen.
Verantwortlich hierfür ist der Konfigurationsparameter session.gc_probability. Dieser hat den Wert "1" und gibt die Wahrscheinlichkeit an, mit welcher die Müllsammlung gestartet wird, also in 1% der Fälle. Möchte man, dass ältere Sessiondateien zuverlässig gelöscht werden, so ist dieser Wert auf 100 (=100%) zu stellen.
Jede Garbage Collection benötigt natürlich auch ein wenig Zeit, sodaß man sich die Frage stellen sollte, ob es nicht ausreicht die Sessiondateien z.B. nur bei jeder zehnten Sessioninitialisierung (10%) löschen zu lassen.
Diese Parameter können in der php.ini, aber auch - wie viele andere Optionen - in den Webserverkonfigurationsdateien, der .htaccess-Datei oder direkt im Script beeinflußt werden.
Hier ein paar Beispiele für die verschiedenen Konfigurationsmöglichkeiten:
php.ini:
session.gc_maxlifetime = 600 ; 10 Minuten Lebenszeitsession.gc_probability = 50 ; 50% - ca. bei jedem ; zweiten Mal löschen
httpd.conf oder .htaccess oder verwandte Dateien:
Session lebt 30 Minutenphp_value session.gc_maxlifetime 1800# Alte Session mit 100% Wahrscheinlicheit löschenphp_value session.gc_probability 100
Direkt im Script:
<?php // 20 Minuten Lebenszeit ini_set("session.gc_maxlifetime", 1200); // 100% Wahrscheinlichkeit ini_set("session.gc_probability", 100);?>
Werden diese Parameter direkt im Script verändert, so muß dies vor dem ersten session_start() resp. session_register() ausgeführt werden, also bevor die Session initialisiert wird.