Sessions

Bei benutzerspezifischen Anwendungen ist eine Identifikation des Benutzer nötig. Das HTTP-Protokoll liefert diese Funktion jedoch nicht, da der Aufruf einer Seite eine neue Sitzung(Prozess) gestartet wird. Das bedeutet, dass der Server jedes Mal die gleichen Informationen für jeden Benutzer bereitstellt. Eine Identifikation eines bestimmten Benutzers ist damit nicht möglich.

Zwar wäre eine Möglichkeit des Benutzers über den Einsatz von Cookies möglich, ist aber nicht „sicher“. Um personalisierte Bereiche zu schaffen, welche sensible Daten oder benutzerspezifische Funktionen besitzen, ist eine eindeutige Zuordnung eines Prozesses zu einem bestimmten Benutzer unverzichtbar. Durch Session (Engl. für Sitzung/en) wird diese Zuordnung ermöglicht. Wird eine Session gestartet, kann der Anwender unter dieser in dem Einsatzbereich identifiziert und und mit den auf ihn zugeschnittenen Daten versorgt werden.

Unverzichtbar sind Sessions besonders bei Anwendungen, bei denen der Anwender sich mit seinem Benutzernamen und einem Passwort anmelden muss. Das ist im Besonderen bei kommerziell genutzten Angeboten im Internet der Fall. Bank- und Zahlungssysteme, Shopsysteme, Foren und personalisierte Internetseiten sind nur eine Auswahl an Möglichkeiten, bei denen Sessions genutzt werden. Aber auch um die Bewegung eines Benutzers zu kontrollieren(Bzw. zu Verfolgen), wird häufig eine Session, also ein eigener Prozess, gestartet.

Der Anwender surft zum Beispiel einen Internetshop an. Das Skript der Seite überprüft, ob er bereits eine so genannte Session-ID besitzt, und weist ihm gegebenfalls eine zu. Dieser zufällig erstellte Identifikationsstring wird den Anwender über das gesamte Shopsystem begleiten, sodass der Server nur die Informationen sendet oder Empfängt, die den Benutzer betreffen. Wählt er nun Produkte aus, werden diese mit dem zu seinem Prozess gehörenden Session-ID im Warenkorb gespeichert. Sollen die Produkte bezahlt werden, übergibt der Kunde seine Session-ID und bekommt durch diese seine ausgewählten Produkte wieder zu sehen. Die Produkte der anderen Kunden bleiben für ihn verschlossen. Hat er den Inhalt seines Warenkorbs bezahlt oder verlässt der Kunde die Seite wieder, kann die Session gelöscht werden.

Sessions stellen somit die Beziehung zwischen dem Anwender und seinen speziellen Daten oder Informationen her. Sie verhindern, dass andere die gleichen Objekte erhalten. Das geschieht über den gesamten bereich hinweg, in dem die Session verlang wird.

Die Vergabe und das Auslesen von Sitzungen ist in PHP weitestgehend automatisiert. Dabei verwendet PHP das Dateisystem standardmäßig zur Speicherung einer Sitzung. Beim Anlegen einer Session wird zunächst geprüft, ob sie bereits existiert. Andernfalls wird eine einzigartige Session-ID vergeben.

Session speichern

Bei der Speicherung der Session-Informationen unterscheiden wir zwei Aspekte:

Speichern der Sessions-Daten

Die tatsächlichen Daten der Session werden auf dem Server gespeichert. Der Speicherort wird in der Datei php.ini über die Konfiguration session.save_path festgelegt. Da in diesem Verzeichnis oft sensible Daten der verschiedenen Benutzer liegen, die der Server aber selbständig verwaltet, sollte dieses Verzeichnis im Benutzerkontext kein Zugriff möglich sin.

Speichern der Session-ID

Die Zuordnung der Session-Daten zu einem Benutzer erfolgt mit Hilfe der Session-ID. Diese wird beim Benutzer(Browser) gespeichert, wenigstens temporär.

Der Benutzer(Browser) ist demnach verantwortlich in der Kommunikation mit dem Server diese Session-ID mitzuteiln. Am praktischsten erweist sich der Transport der Session-ID mit Hilfe von Cookies. Die /Standard-) Einstellung session.use_cookies=1 in der Datei php.ini ermöglicht das.

Eine andere Möglichkeit ist die Weitergabe der Session-ID über URL(Link) oder ein Formularelement. Diese Variante ist aber als unsicherer zu betrachten, da es hier einfacher ist, eine Session zu kompromittieren. Ein anderer Benutzer benötigt »nur« die Session-ID. Der Transport der Session-ID über URL ist standardmäßig aktiviert. Durch den Eintrag session.use_only_cookies=1 in der php.ini wird diese Möglichkeit deaktiviert.

Session-Funktionen

Die Sitzungssteuerung erfolgt über die in der Tabelle aufgeführten Funktionen:

FunktionBeschreibung
session_start()Erzeugt eine Session oder nimmt die aktuelle, basierend auf der Session-ID, die über eine GET-Variable oder ein Cookie übermittelt wurde, wieder auf. Diese Funktion muss immer als Erstes aufgerufen werden.
session_destroy()Löscht alle in der Session enthaltenen Daten.
session_name()Liefert den Namen der aktuellen Session zurück oder erzeugt eine neue, wenn der Name mit übergeben wird.
session_save_path()Gibt den Speicherpfad der Session zurück oder setzt ihn.
session_id()Liefert oder setzt die aktuelle Session-ID
session_register()Registriert eine oder mehrere Variablen in einer Session. Sollte nicht mehr verwendet werden(siehe Text)
session_get_cookie_params()Liefert die Parameter expires, path und domain einer Session in einem Array zurück.
session_set_cookie_params()Setzt die Cookie-Parameter expires, path und domain.
session_decode()Decodiert die Daten aus einer Session aus einer Zeichenkette.
session_encode()Kodiert die Daten aus einer Session in eine Zeichenkette.
session_write_cloe()Speichert die Session-Daten und beendet die Sitzung
session_regenerate_id()Erzeugt für eine bestehende Session eine neue Session-ID. Die alte wird damit ungültig.

Implizites erzeugen

Eine Sitzug wird durch die Speicherung einer Variable implizit aufgerufen. Dazu dient session_register(). Wird diese Funktion aufgerufen, wird auch automatisch eine Sitzung gestartet. Diese Variante ist deprecated, sollte also nicht mehr genutzt werden, da dies ab PHP 6.0 ersetzt wird.

<?php
  $name="Mayer";
  session_register("name");
  echo session_name()."=".session_id();

Explizites erzeugen

Hier wird zuerst die Session direkt gestartet:

<?php
  session_start();
  $name=session_name();
  echo $name . "=" . session_id();
?>

Werte Speichern

Für den Zugriff auf Werte der Session stellt PHP das superglobale assoziative Array $_SESSION[] bereit. Bei früheren PHP-Versionen konntest Du mit Hilfe von Funktionen wie session_register() auf Werte zugreifen, was aber auch Veraltet ist. Man sollte lieber $_SESSION[] bevorzugen, denn dies wird noch bestehen. Bevor auf $_SESSION zugegriffen werden kann, ist es erforderlich session_start() aufzurufen.

Session-Funktionen können Variablen aufnehmen. Darin besteht ihr wahrer Wert. Informationen bleiben so über mehrere Seiten hinweg verfügbar.

<?php
  $freunde=array("Tom","Linus","Torvals");
  $_SESSION["freunde"]=$freunde;
?>

Jetzt kannst Du diese Werte in einer anderen Datei wieder aufrufen. Verwende Du dazu das Superglobale assoziative Array $_SESSION[];

<?php
  session_start(); //Session starten
  $freunde = $_SESSION["freunde"];
  foreach($freunde as $element){
    echo $element." | ";
  }
?>
Ausgabe

Tom | Linus | Torvals |

Session-Informationen zurückgeben

Der Session-Name kann per session_name() ausgegeben werden, jedoch ist dieser Wert oft schon bekannt. Viel wichtiger ist die Funktion session_id(), mit der die richtige Zeichenkette (beziehungsweise ID) zurückgegriffen wird.

<?php
  session_start()
  echo session_name() . "=" . session_id();
?>
Ausgabe

PHPSESSID=9c17d1e4f62896398c62e80702d2b124

Session-Variablen und Sessions löschen

Du löschst eine einzelne Session-Variable indem Du direkt auf das einzelne Array-Element zugreifst, etwa so:

<?php
  unset($_SESSION['freunde']);
?>

oder:

  $_SESSION['freunde'] = NULL;

Um alle Werte der Session zu löschen, verwendest Du:

<?php
  $_SESSION=array();
?>

um alle Daten der Session und die Session selbst zu löschen, rufst Du auf:

<?php
  unset($_SESSION);
?>

Zur Kompatibilität mit älteren PHP-Versionen stehen die Funktionen session_unregister() und session_destroy() zur Verfügung, die Du nicht mehr verwenden solltest.