(PHP 5 >= 5.4.0, PHP 7, PHP 8)
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.
Beispiel #1 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,
z. B. Path-Traversal-Probleme, zu vermeiden. Dieses Beispiel
sollte daher nicht unverändert in Produktivumgebungen verwendet
werden.
<?php
class MySessionHandler implements SessionHandlerInterface
{
private $savePath;
public function open($savePath, $sessionName): bool
{
$this->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