Die Schnittstelle SessionHandlerInterface

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Einführung

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.

Interface-Übersicht

interfaceSessionHandlerInterface {
publicclose(): bool
publicdestroy(string$id): bool
publicgc(int$max_lifetime): int|false
publicopen(string$path, string$name): bool
publicread(string$id): string|false
publicwrite(string$id, string$data): bool
}

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.

Achtung

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

Inhaltsverzeichnis

To Top