&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 <varname>$_SESSION</varname>. ]]> Aufheben der Registrierung einer Variablen mit <varname>$_SESSION</varname>. ]]> 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 &amp; 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.

Hier gehts weiter.

]]>
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.