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.