Sessions
Sinn und Zweck
Cookies werden in der Regel verwendet, um bestimmte Standard-Informationen bei einem Benutzer / Client zu speichern. Das hat etwas damit zu tun, dass man ein Cookie nur setzen bzw. ändern kann, bevor irgendetwas an den Client ausgeliefert worden ist.
Damit kann man aber immer noch nicht einen Client eindeutig identifizieren. Wenn man sich merken will, von welchem Webclient aus ein Zugriff erfolgt ist, dann benötigt man eine sogenannte Session. Eine Session dient dazu einen Webclient eindeutig zu erkennen, damit man spezielle Informationen auch nur mit genau diesem Webclient austauscht.
Beispiel
Stellen wir uns eine Bank vor. Wenn der Kundenberater mit einem Kunden spricht dann ist dies ein vertrauliches Gespräch, welches kein dritter hören soll(te). Genauso funktionieren Sessions. Sie machen den Webclient eindeutig für den Server, so dass dieser weiß wer mit ihm spricht. (sehr sinnvoll bspw. bei Internet-Banking ^^).
Wie macht man das?
Nun das ist eigentlich ganz einfach und wer aufgepasst hat, weiß es schon. Es geht natürlich mit Hilfe eines Cookies. Nur das dieses Cookie einen speziellen Namen hat.
Wenn der Webclient eine Session eröffnen / starten will, dann wird ein spezielles Cookie mit dem Namen PHPSESSID angelegt. Wenn dieses Cookie noch nicht existiert, dann wird es angelegt.
anschauliches Beispiel:
[Grafik]
Umsetzung in Code:
Code-technisch ist das ganz total uninteressant, eine einfache Anweisung erzeugt eine neue Session:
session_start();
mit Hilfe von session_start(); wird eine Session aufgemacht. Jeder
Client der dieses Script abruft (d.h. index.php vom Webserver
anfordert) bekommt dann eine eigene Session.
Ein gesamtes Beispiel könnte so aussehen:
<?php
session_start();
$_SESSION['counter'] = $_SESSION['counter'] + 1;
$_SESSION['Shop'] = 'Hello - Shop';
$_SESSION['Artikel'] = 'Werbegeschenk';
... // jetzt Website ausliefern.
?>
WICHTIG WICHTIG WICHTIG WICHTIG
session_start() muss vor jeder Auslieferung von HTML an den Webserver stehen.
Das autoglobale Array $_SESSION
Für jede Session wird automatisch ein assoziatives Array angelegt. In dieses Array kann man alles mögliche reinpacken und es wird solange gespeichert bis die Session zerstört (mit session_destroy() ) oder der User seinen Webclient beendet.
Die Daten im $_SESSION Array werden gespeichert und stehen bei jedem neuen Webseiten Aufruf zur Verfügung.
Anwendung einer Session
Bei einem klassischen Warenkorb werden ja idR die Artikel gespeichert, obwohl man zwischendurch bei zig anderen Websites war oder sich andere Artikel angeschaut hat.
Jeder User dieses Webshops bekommt beim ersten Besuch eine SessionID zugeteilt (mit dem Cookie s.o.) und dann werden die Artikel für jeden User halt in dem entsprechenden $_SESSION Array gespeichert.
Damit kann der Webserver für jeden Kunden immer den richtigen Warenkorb anzeigen. (vergleiche hierzu auch die obige Grafik, die genau das darstellt).
Gültigkeitsdauer einer Session
Bei Internetbanking Seiten kennt man das vielleicht schon, wenn man mehr als 10 Minuten nichts gemacht hat, dann bekommt man eine Fehlermeldung, die einem sagt: Ihre Session ist abgelaufen, sie wurden ausgeloggt.
Man kann festlegen, wie lange ein Benutzer "nichts" tun darf, bevor die Session zwangsweise beendet wird. Dies geht mit folgender Anweisung:
ini_set('session.gc_maxlifetime', 10*60); //entspricht 600sec = 10 min
Besonderheiten bei Sessions:
Sessions werden beim Webserver in der Regel nicht sofort gelöscht. Der Webserver prüft idR nur mit einer 1% - Wahrscheinlichkeit, ob eine Session abgelaufen ist.
Die Begründung dafür ist ganz einfach, der Webserver hat normalerweise keine Zeit, nach abgelaufenen Sessions zu suchen. Stellen wir uns vor, der Webserver würde jedesmal alle Sessions durchsuchen um zu schaun welche abgelaufen ist.
Bei 10 Benutzer geht das bestimmt schnell, aber bei 100000000 Zugriffen? Nein nicht Zugriffe pro Tag, pro SEKUNDE(!)
Das Internet ist halt gross und ein Webserver wäre sofort "down", wenn er jedesmal prüfen würde, ob die Session abgelaufen ist.
Kann ich erzwingen, dass der Webserver jede Session auf Ablauf prüft?
Ja, und zwar durch folgende Anweisung:
ini_set('session.gc_probability',100);
damit wird die Prüfwahrscheinlichkeit auf 100% (d.h. immer) gesetzt.
Warum muss session_start() am Anfang stehen?
Ganz einfach, damit eine Session erzeugt werden kann, wird dem Client im HTML-Header ein bestimmter Steuerungscode übermittelt.
Wenn ich jetzt mit print direkt eine HTML-Ausgabe bzw. überhaupt eine
Ausgabe auf dem Client erzeuge, dann kann der Webserver keinen
Steuerungscode schicken.
Warum? Du Depp:
Sag mal folgendes zu deiner Freundin / Freund:
"He, ich mach Schluss, hau ab"
wenn sie/er dann gegangen ist (also richtig aus der Tür raus), dann ruf folgendes hinterher:
"war nur Spass"
Kapiert? Die Reihenfolge spielt halt manchmal eine Rolle, bei Sessions muss zuerst den Steuerungscode schicken, nachher geht das nicht mehr.
Warum? <grmpf> Frag die vom W3C, die haben sich das ausgedacht.
Infoblätter
und Arbeitsblätter
noch keine verfügbar