Die Klasse SessionHandlerSessionHandler
&reftitle.intro;
SessionHandler ist eine spezielle Klasse, die
verwendet werden kann, um den aktuellen internen
PHP-Session-Speicherverwalter (PHP Session Save Handler) durch Vererbung
zugänglich zu machen. Es gibt sieben Methoden, die die Wrapper für die
sieben internen Callbacks des Session-Speicherverwalters sind
(open, close,
read, write,
destroy, gc und
create_sid). Standardmäßig ist diese Klasse der
Wrapper für den internen Speicherverwalter, der durch die
Konfigurationsdirektive
session.save_handler
definiert ist (normalerweise files). Andere interne
Session-Speicherverwalter werden von PHP-Erweiterungen wie SQLite (als
sqlite), Memcache (als
memcache), und Memcached (als
memcached) bereitgestellt.
Wenn eine einfache Instanz von SessionHandler
mittels session_set_save_handler als Speicherverwalter
festgelegt wird, wird sie zum Wrapper für den aktuellen Speicherverwalter.
Eine Klasse, die von SessionHandler abgeleitet ist,
erlaubt es, Methoden zu überschreiben, abzufangen oder zu filtern, indem
die Methoden der Elternklasse aufgerufen werden, die letztendlich Wrapper
für die internen PHP-Sessionverwalter sind.
So können zum Beispiel die Methoden read und
write abgefangen werden, um die Session-Daten zu
verschlüsseln bzw. zu entschlüsseln und dann das Ergebnis an die
übergeordnete Klasse zu übergeben. Alternativ könnte auch eine Methode wie
der Garbage Collection Callback gc komplett
überschrieben werden.
Da der SessionHandler ein Wrapper für die Methoden
des aktuellen internen Speicherverwalters ist, kann das obige Beispiel der
Verschlüsselung auf jeden internen Speicherverwalter angewendet werden,
ohne dass die Interna des Verwalters bekannt sein müssen.
Um diese Klasse zu verwenden, muss zuerst der gewünschte Speicherverwalter
mit session.save_handler
festgelegt werden und dann eine Instanz von
SessionHandler oder eine Erweiterung davon an
session_set_save_handler übergeben werden.
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. Auch die Rückgabewerte werden
intern von PHP verarbeitet. Weitere Informationen über den Ablauf von
Sessions sind im Abschnitt session_set_save_handler
zu finden.
&reftitle.classsynopsis;
SessionHandlerimplementsSessionHandlerInterfaceSessionIdInterface&Methods;
&reftitle.notes;
Diese Klasse wurde entwickelt, um den aktuellen internen
PHP-Session-Speicherverwalter darzustellen. Wenn eine eigene
Speicherungsverwaltung benötigt wird, sollte die Schnittstelle
SessionHandlerInterface implementiert werden,
anstatt SessionHandler zu erweitern.
&reftitle.examples;
Die Verwendung von SessionHandler, um den internen
PHP-Speicherverwalter mit Verschlüsselung zu versehen
key = $key;
}
public function read($id)
{
$data = parent::read($id);
if (!$data) {
return "";
} else {
return decrypt($data, $this->key);
}
}
public function write($id, $data)
{
$data = encrypt($data, $this->key);
return parent::write($id, $data);
}
}
// Wir verwenden den nativen 'files'-Handler, aber es funktioniert auch
// mit anderen internen nativen Handlern wie 'sqlite', 'memcache' oder
// 'memcached', die von PHP-Erweiterungen bereitgestellt werden.
ini_set('session.save_handler', 'files');
$key = 'secret_string';
$handler = new EncryptedSessionHandler($key);
session_set_save_handler($handler, true);
session_start();
// Fortfahren mit dem Setzen und Abrufen von Werten anhand der
// Schlüssel von $_SESSION
]]>
Da die Methoden dieser Klasse so konzipiert sind, dass sie als Teil des
normalen Ablaufs einer Session intern von PHP aufgerufen werden, geben
Aufrufe der Kindklasse an die Elternmethoden (&dh; die eigentlichen
internen nativen Prozeduren) &false; zurück, es sei denn, die Session
wurde tatsächlich gestartet (entweder automatisch oder durch den
expliziten Aufruf von session_start). Es ist
wichtig, dies beim Schreiben von Unit-Tests zu beachten, bei denen die
Methoden der Klasse manuell aufgerufen werden können.
&reference.session.entities.sessionhandler;