Wenn die Speicherung in einer Datenbank oder irgendeine andere Art der Speicherung implementiert werden soll, kann session_set_save_handler() verwendet werden, um eine Reihe benutzerdefinierte Speicherfunktionen zu erstellen. Mit dem SessionHandlerInterface können Session-Routinen erstellt werden oder PHP-interne Routinen durch Beerbung von SessionHandler erweitert werden.
Die in session_set_save_handler() definierten Callback-Funktionen sind Methoden, die von PHP während des Lebenszyklus einer Session aufgerufen werden: open
, read
, write
und close
und für Verwaltungsaufgaben: destroy
um eine Session zu löschen und gc
für die regelmäßige Speicherbereinigung.
Deshalb benötigt PHP immer Session-Speicherroutinen. Der Standard ist normalerweise die interne 'files'-Speicherroutine. Eine benutzerdefinierte Speicherroutine kann mittels session_set_save_handler() erstellt werden. Alternative interne Speicherroutinen werden auch von PHP-Erweiterungen, z. B. sqlite
, memcache
und memcached
zur Verfügung gestellt und können mittels session.save_handler festgelegt werden.
Wenn die Session beginnt, ruft PHP intern die open
-Routine, gefolgt vom read
-Callback auf, der eine verschlüsselte Zeichenkette genau so zurückgeben sollte, wie sie ursprünglich für die Speicherung übergeben wurde. Nachdem der read
-Callback die verschlüsselte Zeichenkette zurückgegeben hat, wird sie von PHP entschlüsselt und die Superglobale $_SESSION mit dem resultierenden Array gefüllt.
Wenn das PHP-Skript endet (oder wenn session_write_close() aufgerufen wird), wird die Superglobale $_SESSION intern verschlüsselt und zusammen mit der Session-ID an den write
-Callback übergeben. Nach dem write
-Callback ruft PHP intern den close
-Callback auf.
Wenn eine Session gelöscht werden soll, ruft PHP die destroy
-Routine mit der Session-ID auf.
Von Zeit zu Zeit ruft PHP den gc
-Callback auf, um Sessions zu löschen, die entsprechend ihrer eingestellten maximalen Lebensdauer abgelaufen sind. Diese Routine sollte alle gespeicherten Datensätze löschen, auf die länger als die in $lifetime
festgelegte Zeitspanne nicht mehr zugegriffen wurde.