(PHP 4, PHP 5)
session_set_save_handler — Setzt benutzerdefinierte Session-Speicherfunktionen
session_set_save_handler() setzt die benutzerdefinierten Session-Speicherfunktionen, die zur Speicherung und Wiederherstellung von zur Session gehörigen Daten verwendet werden. Dies ist äußerst nützlich, wenn eine andere als die mit PHP-Sessions zur Verfügung stehende Art der Speicherung, z.B. die Speicherung der Session-Daten in einer lokalen Datenbank, bevorzugt wird.
Die öffnen-Routine funktionert wie ein Konstruktor in einer Klasse und wird ausgeführt, wenn die Session geöffnet wird. Sie erwartet zwei Parameter: als Ersten den Speicherpfad und als Zweiten den Namen der Session.
Die schließen-Routine funktionert wie ein Destruktor in einer Klasse und wird am Ende der Session ausgeführt.
Damit die Speicherroutine funktioniert wie erwartet, muss die lesen-Routine immer eine Zeichenkette zurückgeben. Wenn es keine Daten zu lesen gibt, geben Sie eine leere Zeichenkette zurück. Rückgabewerte anderer Routinen werden in boolesche Ausdrücke umgewandelt. TRUE für einen Erfolg, FALSE für einen Fehler.
Hinweis: Die schreiben-Routine wird nicht ausgeführt, bevor die Ausgabe abgeschlossen ist. Deshalb werden auch niemals Fehlermeldungen der schreiben-Routine im Browser erscheinen. Wenn die Ausgabe von Fehlermeldungen nötig ist, sollte diese stattdessen in eine Datei geschrieben werden.
Die löschen-Routine wird ausgeführt, wenn eine Session mittels session_destroy() gelöscht wird. Sie erwartet die Session-ID als einzigen Parameter.
Der Speicherbereiniger (garbage collector) wird ausgeführt, wenn der Session-Speicherbereiniger ausgeführt wird. Er erwartet die maximale Session-Verfallszeit als einzigen Parameter.
Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE.
Beispiel #1 session_set_save_handler() Beispiel
Das folgende Beispiel liefert eine dateibasierte Session-Speicherung, die der Standard-Speicherroutine files der PHP-Sessions ähnlich ist. Dieses Beispiel kann problemlos erweitert werden, dass es Datenbank-Speicherung mittels ihrer bevorzugten PHP-gestützten Datenbank beinhaltet.
<?php
function oeffne($speicherpfad, $session_name)
{
global $sess_speicherpfad;
$sess_speicherpfad = $speicherpfad;
return(true);
}
function schliesse()
{
return(true);
}
function lese($id)
{
global $sess_speicherpfad;
$sess_datei = "$sess_speicherpfad/sess_$id";
return (string) @file_get_contents($sess_datei);
}
function schreibe($id, $sess_daten)
{
global $sess_speicherpfad;
$sess_datei = "$sess_speicherpfad/sess_$id";
if ($fp = @fopen($sess_datei, "w")) {
$return = fwrite($fp, $sess_daten);
fclose($fp);
return $return;
} else {
return(false);
}
}
function loesche($id)
{
global $sess_speicherpfad;
$sess_datei = "$sess_speicherpfad/sess_$id";
return(@unlink($sess_datei));
}
function gc($maxlifetime)
{
global $sess_speicherpfad;
foreach (glob("$sess_speicherpfad/sess_*") as $dateiname) {
if (filemtime($dateiname) + $maxlifetime < time()) {
@unlink($dateiname);
}
}
return true;
}
session_set_save_handler("oeffne", "schliesse", "lese", "schreibe", "loesche", "gc");
session_start();
// verfahren Sie mit Sessions wie gewohnt
?>
Ab PHP 5.0.5 werden die Routinen write und close nach dem Zerstören von Objekten aufgerufen und können deshalb keine Objekte verwenden oder Exceptions (Fehler-, Ausnahmesituationen) auslösen. Objekt-Destruktoren können aber Sessions verwenden.
Es ist möglich, session_write_close() über den Destruktor aufzurufen, um dieses Henne-Ei Problem zu lösen.
Bei manchen SAPIs ändert sich das aktuelle Arbeitsverzeichnis, falls die Session durch die Beendigung des Skripts geschlossen wird. Mittels session_write_close() ist es möglich, die Session schon früher zu schließen.