(PHP 4, PHP 5, PHP 7)
session_set_save_handler — Setzt benutzerdefinierte Session-Speicherfunktionen
$open
, callback $close
, callback $read
, callback $write
, callback $destroy
, callback $gc
)$sessionhandler
[, bool $register_shutdown
= true
] )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.
Diese Funktion hat zwei Prototypen.
sessionhandler
Ein Exemplar einer Klasse die SessionHandlerInterface implementiert, wie beispielsweise SessionHandler, das als benutzerdefinierte Session-Speicherfunktion registriert werden soll.
register_shutdown
Registriert session_register_shutdown() als eine register_shutdown_function() Funktion.
open
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.
close
Die schließen-Routine funktionert wie ein Destruktor in einer Klasse und wird am Ende der Session ausgeführt.
read
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.
write
Die schreiben-Routine, die aufgerufen wird, wenn Session-Daten gespeichert werden sollen. Diese Funktion erwartet zwei Parameter: eine Session-ID und die zugehörigen Daten.
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.
destroy
Die löschen-Routine wird ausgeführt, wenn eine Session mittels session_destroy() gelöscht wird. Sie erwartet die Session-ID als einzigen Parameter.
gc
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 wird FALSE
zurückgegeben.
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
?>
Beispiel #2 session_set_save_handler() mit Verwendung von SessionHandler
<?php
class MySessionHandler extends SessionHandler {
public function open($save_path, $sessionid)
{
global $sess_save_path;
$sess_save_path = $save_path;
return(true);
}
public function close()
{
return true;
}
public function read($sessionid)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return (string) @file_get_contents($sess_file);
}
public function write($sessionid, $sessiondata)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file, "w")) {
$return = fwrite($fp, $sess_data);
fclose($fp);
return $return;
} else {
return(false);
}
}
public function destroy($sessionid)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return(@unlink($sess_file));
}
public function gc($maxlifetime)
{
global $sess_save_path;
foreach (glob("$sess_save_path/sess_*") as $filename) {
if (filemtime($filename) + $maxlifetime < time()) {
@unlink($filename);
}
}
return true;
}
}
$handler = new MySessionHandler();
session_set_save_handler($handler);
session_start();
?>
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.
Version | Beschreibung |
---|---|
5.4.0 | SessionHandlerInterface und SessionHandler zum Implementieren von benutzerdefinierten Session-Speicherfunktionen hinzugefügt. |