Die Schnittstelle SessionHandlerInterface
SessionHandlerInterface
&reftitle.intro;
SessionHandlerInterface ist eine Schnittstelle, die
den minimalen Prototyp für die Erstellung einer benutzerdefinierten
Sessionverwaltung definiert. Um eine benutzerdefinierte Sessionverwaltung
an session_set_save_handler zu übergeben, die ihren
OOP-Aufruf verwendet, kann die Klasse diese Schnittstelle
implementieren.
Es ist zu beachten, dass die Callback-Methoden dieser Klasse dazu gedacht
sind, intern von PHP aufgerufen zu werden und nicht aus dem
Anwenderprogramm aufgerufen werden sollen.
&reftitle.interfacesynopsis;
SessionHandlerInterface
&Methods;
&reftitle.examples;
Ein Beispiel mit SessionHandlerInterface
Das folgende Beispiel bietet eine dateibasierte Session-Speicherung
ähnlich dem standardmäßigen PHP-Session-Speicherverwalter
(PHP Session Standard Save Handler) files. Dieses
Beispiel kann leicht erweitert werden, um die Speicherung in einer
Datenbank mit der bevorzugten von PHP unterstützten Datenbank-Engine zu
ermöglichen.
Zu beachten ist, dass wir den OOP-Prototyp zusammen mit
session_set_save_handler verwenden und die
Shutdown-Funktion mit dem Parameter flag der Funktion registrieren. Dies
wird im Allgemeinen empfohlen, wenn Objekte als Session-Speicherverwalter
registriert werden.
Der Kürze halber wird in diesem Beispiel auf eine Überprüfung der
Eingaben verzichtet. Allerdings handelt es sich bei den
$id-Parametern um vom Benutzer gelieferte Werte, die
unbedingt überprüft und bereinigt werden müssen, um Schwachstellen,
&zb; Path-Traversal-Probleme, zu vermeiden. Dieses Beispiel
sollte daher nicht unverändert in Produktivumgebungen verwendet
werden.
savePath = $savePath;
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}
public function close(): bool
{
return true;
}
#[\ReturnTypeWillChange]
public function read($id)
{
return (string) @file_get_contents("$this->savePath/sess_$id");
}
public function write($id, $data): bool
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}
public function destroy($id): bool
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
#[\ReturnTypeWillChange]
public function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
unlink($file);
}
}
return true;
}
}
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
// Fortfahren mit dem Setzen und Abrufen von Werten anhand der
// Schlüssel von $_SESSION
]]>
&reference.session.entities.sessionhandlerinterface;