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 Lebenszeit session.gc_probability = 50   ; 50% - ca. bei jedem                               ; zweiten Mal löschen
httpd.conf oder .htaccess oder verwandte Dateien:
# Session lebt 30 Minuten php_value  session.gc_maxlifetime  1800 # Alte Session mit 100% Wahrscheinlicheit löschen php_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.