Start > Informatik > PHP - Kurs > Sessions

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


Ticker
Last update:
October 08. 2018 08:46:35