PHP/PHP-Sitzungsfunktionen: Unterschied zwischen den Versionen
Michi (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Michi (Diskussion | Beiträge) |
||
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
Zeile 6: | Zeile 6: | ||
! Funktion !! Beschreibung | ! Funktion !! Beschreibung | ||
|- | |- | ||
| <tt>session_start</tt> || Initialisiert eine Sitzung und muss auf jeder | | <tt>session_start</tt> || Initialisiert eine Sitzung und muss auf jeder Seite am Anfang ausgeführt werden. | ||
|- | |- | ||
| <tt>session_destroy</tt> || Zerstört alle Sitzungsdaten. Der nächste Aufruf der Funktion "session_start" startet eine neue Sitzung. | | <tt>session_destroy</tt> || Zerstört alle Sitzungsdaten. Der nächste Aufruf der Funktion "session_start" startet eine neue Sitzung. | ||
Zeile 104: | Zeile 104: | ||
| <tt>session.entropy_file</tt> || Pfad zu einer Datei mit Startwerten für den Generator der Sitzungs-IDs. | | <tt>session.entropy_file</tt> || Pfad zu einer Datei mit Startwerten für den Generator der Sitzungs-IDs. | ||
|- | |- | ||
| <tt>session.entropy_length</tt> || Anzahl der | | <tt>session.entropy_length</tt> || Anzahl der Byte, die von der Datei mit den Startwerten gelesen werden. Der Standardwert ist "0". | ||
|- | |- | ||
| <tt>session.use_cookies</tt> || Wird "1" gesetzt, wenn Cookies verwendet werden sollen. | | <tt>session.use_cookies</tt> || Wird "1" gesetzt, wenn Cookies verwendet werden sollen. |
Aktuelle Version vom 7. Juli 2012, 13:36 Uhr
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
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.