&reftitle.examples;
Grundlegende Anwendung
Sessions bieten eine einfache Möglichkeit, Daten für individuelle Benutzer
unter einer eindeutigen Session-ID zu speichern. Sie können verwendet
werden, damit Daten zwischen Seitenanforderungen bestehen bleiben.
Session-IDs werden in der Regel über Session-Cookies an den Browser
gesendet und die ID wird verwendet, um vorhandene Session-Daten abzurufen.
Wenn es keine ID oder kein Session-Cookie gibt, wird PHP veranlasst, eine
neue Session zu erstellen und eine neue Session-ID zu erzeugen.
Sessions folgen einem einfachen Ablauf. Wenn eine Session gestartet wird,
ruft PHP entweder eine vorhandene Session unter Verwendung einer
(normalerweise von einem Session-Cookie) übergebenen ID ab oder erzeugt
eine neue Session, falls keine Session-ID übergeben wurde. Nachdem
die Session gestartet wurde, füllt PHP die
$_SESSION-Superglobale mit allen Session-Daten. Am Ende
des Skripts nimmt PHP automatisch den Inhalt der
$_SESSION-Superglobalen, serialisiert ihn und verwendet
die Session-Speicherroutine um ihn zu speichern.
Standardmäßig verwendet PHP die interne
files-Speicherroutine, die mittels
session.save_handler
festgelegt ist. Diese speichert die Session-Daten auf dem Server an der mit
der Konfigurationsanweisung
session.save_path angegebenen
Stelle.
Sessions können über die Funktion session_start
gestartet werden. Falls die Konfigurationsanweisung
session.auto_start auf
1 gesetzt ist, wird eine Session automatisch zu
Beginn einer Anfrage gestartet.
Sessions werden normalerweise automatisch geschlossen, wenn PHP am Ende
eines Skripts ist, können aber über
session_write_close auch manuell geschlossen werden.
Registrierung einer Variablen mit $_SESSION.
]]>
Aufheben der Registrierung einer Variablen mit
$_SESSION.
]]>
Die Variable $_SESSION selbst darf NICHT mit
unset($_SESSION) gelöscht werden, da dies die
Registrierung von Session-Variablen über die Superglobale
$_SESSION deaktivieren würde.
In Session-Variablen können keine Referenzen verwendet werden, weil es
keine praktikable Möglichkeit gibt, eine Referenz in eine andere Variable
zurückzuführen.
Bei dateibasierten Sessions (der Standard in PHP) wird die Session-Datei
gesperrt, wenn eine Session über session_start oder
implizit über
session.auto_start geöffnet
wurde. Einmal gesperrt, kann solange kein anderes Skript auf dieselbe
Session-Datei zugreifen, bis die Session durch Beenden des ersten Skripts
oder durch den Aufruf von session_write_close
geschlossen wurde.
Dies ist wahrscheinlich ein Problem auf Websites, die verstärkt AJAX
verwenden und mehrere gleichzeitige Zugriffe haben. Der einfachste Weg,
damit umzugehen, ist, session_write_close möglichst
früh im Skript aufzurufen, sobald alle nötigen Änderungen an der Session
vorgenommen wurden. Alternativ könnte ein Session-Backend verwendet
werden, das gleichzeitige Zugriffe unterstützt.
Übermittlung der Session-ID
Es gibt zwei Methoden, eine Session-ID zu übermitteln:
Cookies
URL-Parameter
Das Session-Modul unterstützt beide Methoden. Cookies sind optimal, aber da
sie nicht immer zur Verfügung stehen, bieten wir auch noch eine Alternative
an. Die zweite Methode hängt die Session-ID direkt an die URLs.
PHP ist in der Lage, Links transparent umzuwandeln. Ist die Laufzeit-Option
session.use_trans_sid aktiviert, werden relative
URIs automatisch so geändert, dass sie die Session-ID enthalten.
Die &php.ini;-Anweisung
arg_separator.output
ermöglicht es, die Trennung von Argumenten anzupassen. Um die volle
XHTML-Konformität zu gewährleisten, muss dort & angegeben werden.
Alternativ kann die Konstante SID verwendet werden,
die definiert ist, nachdem die Session gestartet wurde. Falls der Client
kein geeignetes Session-Cookie gesendet hat, hat sie die Form
session_name=session_id. Andernfalls wird sie zu einer
leeren Zeichenkette erweitert. Aus diesem Grund kann sie bedingungslos in
URLs eingebettet werden.
Das folgende Beispiel demonstriert, wie eine Variable registriert wird und
wie unter Verwendung einer SID korrekt auf eine andere
Seite verwiesen wird.
Zählen der Seitenaufrufe eines einzelnen Benutzers
Hallo Besucher, Sie haben diese Seite mal
aufgerufen.
]]>
Die Funktion htmlspecialchars kann dazu verwendet
werden, um bei der Ausgabe der SID XSS-ähnliche
Angriffe zu verhindern.
Die oben gezeigte Ausgabe der SID ist nicht nötig,
wenn PHP mit
--enable-trans-sid
übersetzt wurde.
Bei nichtrelativen URLs wird davon ausgegangen, dass sie auf externe
Seiten zeigen und deshalb keine SID angehängt, weil
es ein Sicherheitsrisiko wäre, die SID an einen
anderen Server zu übermitteln.
Individuelle Session-Routinen
Wenn die Speicherung in einer Datenbank oder irgendeine andere Art der
Speicherung implementiert werden soll, kann
session_set_save_handler verwendet werden, um eine
Reihe benutzerdefinierte Speicherfunktionen zu erstellen. Mit dem
SessionHandlerInterface können Session-Routinen
erstellt werden oder PHP-interne Routinen durch Beerbung von
SessionHandler erweitert werden.
Die in session_set_save_handler definierten
Callback-Funktionen sind Methoden, die von PHP während des Lebenszyklus
einer Session aufgerufen werden: open,
read, write und
close und für Verwaltungsaufgaben:
destroy um eine Session zu löschen und
gc für die regelmäßige Speicherbereinigung.
Deshalb benötigt PHP immer Session-Speicherroutinen. Der Standard ist
normalerweise die interne 'files'-Speicherroutine. Eine benutzerdefinierte
Speicherroutine kann mittels session_set_save_handler
erstellt werden. Alternative interne Speicherroutinen werden auch von
PHP-Erweiterungen, &zb; sqlite,
memcache und memcached zur
Verfügung gestellt und können mittels
session.save_handler
festgelegt werden.
Wenn die Session beginnt, ruft PHP intern die
open-Routine, gefolgt vom
read-Callback auf, der eine verschlüsselte
Zeichenkette genau so zurückgeben sollte, wie sie ursprünglich für die
Speicherung übergeben wurde. Nachdem der
read-Callback die verschlüsselte Zeichenkette
zurückgegeben hat, wird sie von PHP entschlüsselt und die Superglobale
$_SESSION mit dem resultierenden Array gefüllt.
Wenn das PHP-Skript endet (oder wenn
session_write_close aufgerufen wird), wird die
Superglobale $_SESSION intern verschlüsselt und zusammen
mit der Session-ID an den write-Callback übergeben.
Nach dem write-Callback ruft PHP intern den
close-Callback auf.
Wenn eine Session gelöscht werden soll, ruft PHP die
destroy-Routine mit der Session-ID auf.
Von Zeit zu Zeit ruft PHP den gc-Callback auf, um
Sessions zu löschen, die entsprechend ihrer eingestellten maximalen
Lebensdauer abgelaufen sind. Diese Routine sollte alle gespeicherten
Datensätze löschen, auf die länger als die in
$lifetime festgelegte Zeitspanne nicht mehr
zugegriffen wurde.