PHP/PHP-Sitzungsfunktionen

Aus Mikiwiki
< PHP
Version vom 7. Juli 2012, 15:36 Uhr von Michi (Diskussion | Beiträge) (Funktionsübersicht)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Funktionsübersicht

Die in PHP verwendeten Sitzungsfunktionen basieren auf Cookies oder alternativ auf deren Weitergabe der Sitzungsinformationen über den URL, erlauben jedoch eine ungleich bequemere Programmierung. Folgende Übersicht zeigt alle von PHP5 zur Verfügung gestellten Sitzungsfunktionen.

Funktion Beschreibung
session_start Initialisiert eine Sitzung und muss auf jeder Seite am Anfang ausgeführt werden.
session_destroy Zerstört alle Sitzungsdaten. Der nächste Aufruf der Funktion "session_start" startet eine neue Sitzung.
session_name Setzt oder holt den Namen der aktuellen Sitzung.
session_module_name Setzt oder holt das aktuelle Sitzungsmodul. Ausser dem eingebauten Modul kann auch ein selbstgeschriebenes verwendet werden.
session_save_path Setzt oder holt den Speicherort der aktuellen Sitzung. Dies gilt nur, wenn die Sitzungsdaten in Dateien gespeichert werden.
session_id Setzt oder holt die aktuelle Sitzungs-ID. Soll normalerweise nur gelesen werden.
session_register Bindet eine Variable an die aktuelle Sitzung. Die Variable steht damit auf der nächsten Seite zur Verfügung.
session_unregister Löscht eine Variable aus der aktuellen Sitzung.
session_is_registered Ermittelt, ob eine Variable an die aktuelle Sitzung gebunden wurde.
session_get_cookie_params Holt die Parameter der Sitzungscookies.
session_set_cookie_params Setzt die Parameter der Sitzungscookies.
session_decode Dekodiert Sitzungsdaten aus einer Zeichenkette. Normalerweise erfolgt dies automatisch und muss nicht selbst erledigt werden.
session_encode Kodiert Sitzungsdaten in einer Zeichenkette. Normalerweise erfolgt dies automatisch und muss nicht selbst erledigt werden.
session_cache_expire Setzt oder liest die Dauer, die Sitzungsdaten im Cache verweilen können. Der Wert wird in Minuten angegeben. Der Standardwert beträgt 180 Minuten.
session_cache_limiter Steuert den Cacheort bzw. schaltet den Cache ein und aus. Zulässige Werte sind "nocache" (aus), "private" (Benutzung des Webbrowser-Caches) oder "public" (Server bzw. Proxy). Die Funktion muss vor "session_start" aufgerufen werden.
session_write_close Schreibt die Sitzungsdaten in den Sitzungsspeicher und schliesst die Sitzung.

Einführung in PHP-Sitzungen

PHP-Sitzungen basieren auf der Vergabe einer eindeutigen Sitzungs-ID. Die Verknüpfung zwischen den Zugriffen kann entweder über Cookies oder über den URL erfolgen. Durch besondere Funktionen können auch Variablen an die Sitzung gebunden werden. Dies erleichtert den Aufbau entsprechender URLs bzw. die Übergabe der Werte an Cookies. Sitzungen können ständig aktiviert sein, in diesem Fall ist in der Konfigurationsdatei "php.ini" der Parameter "session.auto_start" auf "1" ("TRUE") zu setzen. Andernfalls löst eine der Funktionen "session_start" die Anforderung der Sitzungswerte explizit oder bei "session_request" implizit aus. Bei der Speicherung von Variablen ist zu beachten, dass diese automatisch serialisiert werden; Variablen werden dabei in eine einfach speicherbare Form (eine Zeichenkette) gebracht. Andernfalls könnten Arrays nicht in Cookies gespeichert werden. Objekte lassen sich zur Zeit mit PHP-Sitzungen nur eingeschränkt speichern, für komplexe Daten sollten deswegen Arrays verwendet werden.

Das folgende Beispiel zeigt die Registrierung einer Variablen und die ÜBertragung auf die nächste Seite. Die Sitzung selber wird dabei implizit initialisiert. Die allenfalls fehlerhafte Ausgabe entsteht durch eine unrichtige Konfiguration der Sitzungen - die richtige Konfiguration wird im nächsten Abschnitt beschrieben.

<h3>Zähler</h3>
<?php
session_start();
$sessionid = session_id();
if (isset($_SESSION['counter']))
{
  $counter = ((int) $_SESSION['counter']) + 1;
}
else
{
  $counter = 1;
}
$_SESSION['counter'] = $counter;
echo <<<OUT
  <p>Hallo, Sie waren schon <b>$counter</b> mal auf dieser Seite!</p>
  <p>Machen Sie bitte <a href="{$_SERVER['PHP_SELF']}">hier</A> weiter.</p>
OUT;
?>

Zähler


Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /WWW/test/test.php:2) in /WWW/test/test.php on line 3

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /WWW/test/test.php:2) in /WWW/test/test.php on line 3

Hallo, Sie waren schon 1 mal auf dieser Seite!

Machen Sie bitte hier weiter.

Sitzungen konfigurieren

Läuft auf einem Server nur eine Anwendung, so ist es sinnvoller, bestimmte Einstellungen direkt in der Konfigurationsdatei "php.ini" vorzunehmen. Die folgende Tabelle zeigt die möglichen Schalter. Viele dieser Optionen lassen sich auch über Funktionen steuern.

Schalter Beschreibung
session.save_handler Name der Prozedur, mit der Daten gespeichert werden. Der Standardwert ist "files".
session.save_path Pfad, wo Dateien erzeugt werden. Standardwert ist "/tmp".
session.name Name der Sitzungscookies. Der Standardwert ist "PHPSESSID".
session.auto_start Mit "1" startet das Sitzungsmodul zu Beginn einer Anfrage automatisch. Der Standardwert ist "0".
session.cookie_lifetime Lebensdauer des Sitzungscookies in Sekunden. Der Wert "0" erzeugt ein Cookie für die Sitzungsdauer.
session.serialize_handler Art der Serialisierung der Daten. Mögliche Beispiele sind "php" oder "wddx".
session.gc_probability Wahrscheinlichkeit, mit der die Aufräumroutine (engl. garbage collection) startet. Der Standardwert ist "1".
session.gc_maxlifetime Zeit in Sekunden, nach der Daten aufgeräumt werden.
session.referer_check Referer, der bei jedem Zugriff geprüft wird. Stimmt der Referer nicht, so wird die Sitzung gelöscht und neu gestartet. Der Referer ist die letzte Adresse, von welcher der Seitenabruf kommt.
session.entropy_file Pfad zu einer Datei mit Startwerten für den Generator der Sitzungs-IDs.
session.entropy_length Anzahl der Byte, die von der Datei mit den Startwerten gelesen werden. Der Standardwert ist "0".
session.use_cookies Wird "1" gesetzt, wenn Cookies verwendet werden sollen.
session.cookie_path Pfad, der im Cookie gespeichert wird.
session.cookie_domain Domain für das Cookie.
session.cache_limiter Methoden der Cacheverwaltung. Möglich sind "nocache" (der Standardwert), "private" und "public".
session.cache_expire Zeitdauer, während der Daten im Cache bleiben in Minuten. Der Standardwert ist 180. Die Angabe bleibt wirklungslos, wenn "nocache" eingestellt wurde.

Sitzungen einrichten und nutzen

Eine Sitzung wird durch Aufruf der Funktion "session_start" initialisiert. Am Ende der Sitzung können die Werte mit "session_destroy" ausdrücklich zerstört werden. Beide Funktionen benötigen keine Parameter und geben immer "TRUE" zurück.

Der Name einer Sitzung ist zugleich Name des Sitzungscookies oder der "GET"-Variablen und kann folgerndermassen verändert werden. Der Standardwert ist "PHPSESSID". Die Funktion gibt den aktuellen Namen auch wieder zurück.

<?php
session_name("XYZ");
$name = session_name();
echo $name;
?>
XYZ

Das folgende Beispiel zeigt die Anwendung. Unter normalen Umständen besteht keine Notwendigkeit, den Namen zu ändern. Wird jedoch eine Sitzungssteuerung selbst entworfen und dafür eine Datenbank verwendet, so werden möglicherweise mehrere Sites Sitzungsdaten in derselben Tabelle ablegen. Dann kann eine Unterscheidung sinnvoll sein. Derartige Techniken werden bei der Programmierung von Hochleistungsanwendungen verwendet. Dabei werden statt einem PHP-Server mehrere eingesetzt. Ein Netzwerklastverteilungssystem verteilt dann die Anfragen auf die verschiedenen Rechner. Damit die Sitzung nicht beim Wechsel von einem Rechner zum anderen verlorengeht, arbeitet im Hintergrund ein gemeinsamer Datenbankserver. Da solche Systeme aber oft mehrere Sites betreiben, müssen diese wiederum unterschieden werden.

PHP-Sitzungen intern

In den vorangegangenen Abschnitten wurden verschiedene Techniken zur Speicherung von Daten vorgestzellt. PHP nutzt das Dateisystem, um Sitzungsdaten zu speichern. Dabei werden sehr viele Dateien angelegt - für jede aktive Sitzung eine. Bei der Wahl des Dateisystems sollte darauf geachtet werden, dass dieses mit sehr vielen kleinen Dateien effizient umgehen kann; besser als "ext2fs" eignet sich dafür "reiserfs". Kann im Betriebssystem die Clustergrösse eingestellt werden, so sollte ein möglichst kleiner Wert (z. B. 1 KB) eingestellt werden.

Die Funktion "session_save_path" legt den Pfad fest, unter dem die Sitzungsdaten gespeichert werden. Der Parameter ist optional. Standardmässig ist in der Konfigurationsdatei "php.ini" der Pfadname "/tmp" eingetragen.

<?php
session_save_path("pfad zu den dateien");
$sessionpath = session_save_path();
echo $sessionpath
?>

Der Name der Datei entspricht der Sitzungs-ID, der Inhalt der Darstellung der Variablen, wie sie die Funktion "serialize" erzeugt. In der Konfigurationsdatei "php.ini" kann mit dem Parameter "garabage.collection" festgelegt werden, wann dieses Verzeichnis aufgeräumt wird - der Standardwert beträgt 1'440 Minuten (ein Tag). Zumindest beim Start der ersten Versuche mit Sitzungen ist ein Blick in dieses Verzeichnis ratsam, weil die Aktivitäten der Skripte gut überwacht werden können. Das bereits gezeigte Beispiel würde in der Sitzungsdatei folgende Daten ablegen. Die serialiserte Form einer Variablen ist gut lesbar: Zuerst kommt der Name, dann nach dem senkrechten Strich der Typ ("s" steht für "string", "i" für "integer" usw.), dann die aktuelle Länge und zuletzt folgen die eigentlichen Daten. Mehrere Variablen sind durch Strichpunkte getrennt.

mycolor|s:4:"red";

Sitzungsvariablen

Sitzungsvariablen sind Variablen, die fest an eine Sitzung gebunden werden. Jede Variable, die mit HTTP-"get" oder Cookies von einer Seite zur nächsten transportiert wird, ist eine Sitzungsvariable. Der Wert und der Name der Variable ist an die Sitzung gebunden. Ist die Sitzung zuende, so verfällt die Variable.

PHP5 bietet mit der Sitzungsverwaltung drei Funktionen zum bequemen Umgang mit Sitzungsvariablen. Eine Variable für eine Sitzung wird wie folgt erzeugt. Der Variablenname muss eine existierende globale Variable sein. Ist das der Fall, gibt die Funktion "TRUE" zurück, ansonsten "FALSE". Die Auswertung des Rückgabeparameters ist nicht zwingend notwendig.

$ok = session_register("variablenname");

Manchmal ist es notwendig, die Sitzungsvariable wieder zu löschen.

session_unregister("variablenname");

Um zu erkennen, ob eine bestimmte Variable als Sitzungsvariable gebunden wurde, wird die Funktion "session_is_registered" genutzt. Sie gibt "TRUE" oder "FALSE" zurück. Der Inhalt der so übermittelten Variablen wird in ihr selbst zurückgegeben, die Variable steht als automatisch auf der nächsten Seite zur Verfügung. Ebenso wird die Variable automatisch serialisiert (in eine Zeichenkette umgewandelt), wenn es sich um ein Array handelt.

$isregistered = session_is_registered("variablenname");

Mit der Funktion "session_decode" können die serialisierten Werte dekodiert werden, um die Variablen zurückzuholen. Entsprechend werden Variablen mit der Funktion "session_encode" ausdrücklich serialisiert.

Das Array "$_SESSION"

Ebenso wie die Arrays für Formular- oder URL-Werte werden auch die Sitzungsvariablen in einem Array gespeichert. Dieses Array namens "$SESSION" kann überall verwendet werden, da es global verfügbar ist. Es ist sowohl schreib- als auch lesbar.

$SESSION['farbe'] = "red";

Das entspricht dem Setzen des Wertes mit "session_register". Ebenso können alle Variablen aus dem Array direkt gelesen werden.