10. Sessions in PHP

Sobald sich ein Benutzer auf einer Website eingeloggt hat, soll diese Information auch beim nächsten Mal vorhanden sein. Wie aber können wir diese speichern?

Mit Cookies. Und um diese zu verwalten, bietet PHP ein eigenes Session-System an. Dabei nimmt es dir die meiste Arbeit ab, du musst dich nur noch um die Daten kümmern.

Im letzten Teil des PHP-Tutorials haben wir uns übrigens mit der Verarbeitung von Dateien in PHP beschäftigt.

Der Session-Header

Wann immer Du in PHP mit Sessions arbeiten willst, musst Du zunächst die Funktion session_start() ausführen und zwar vor jeglicher Ausgabe. Zum Beispiel so:

<?php
  session_start(); // Session initialisieren

  // Weiterer PHP-Code
?>

Das hängt damit zusammen, dass PHP innerhalb des Headers sicherstellen muss, dass ein Cookie gesetzt wird. Nur wenn zuvor kein Zeichen (auch kein Leerzeichen vor „<?php“) ausgegeben wurde, ist das möglich.

Cookies in PHP

Um Dir das genauer darzulegen, gibt es zunächst einen kleinen Exkurs Richtung Cookies. Diese werden nämlich von PHP dazu verwendet, einem Benutzer seine Sitzung zuzuordnen.

Mit der Funktion setcookie() kannst Du auch selber Cookies setzen und so theoretisch ein eigenes Session-System implementieren. Auch diese Funktion muss vor jeglicher Zeichenausgabe ausgeführt werden.

Aber wie funktioniert nun so eine Sitzungszuordnung? Ganz einfach, PHP teilt Dir als Besucher der Website zum Beispiel ein Session-Cookie mit dem Wert „DHBJKRGHJUK“ zu. Mit jedem Aufruf der Website sendet dein Browser das einmal gesetzte Cookie zurück.

Die Website schaut nun einer Datenbank bzw. einer Datei nach, ob dem Wert „DHBJKRGHJUK“ bereits Daten zugeordnet wurden. Ist dies der Fall, können diese anschließend von PHP abgefragt werden.

Session-Werte setzen und abfragen

Mit diesem Wissen können wir uns nun weiter mit den Sessions auseinandersetzen. Sobald Du den Session-Header (siehe oben) einmal gesetzt hast, können über die Superglobale ganz einfach Sessions gesetzt und abgefragt werden:

<?php
  session_start(); // Session initialisieren

  // Session- Werte benutzer und emails setzen //
  $_SESSION['benutzer'] = 'Peter';
  $_SESSION['emails'] = array('peter1@example.com', 'peter2@example.com');

  if (isset($_SESSION['benutzer'])) {
    // Wert existiert -> Ausgeben //
    echo $_SESSION['benutzer'];
    
    // und Wert einer anderen Variable zuweisen //
    $benutzer = $_SESSION['benutzer'];
  }
?>

Das sieht nicht nur recht einfach aus, sondern das ist es auch. Mit Hilfe dieser Superglobalen können Werte in die Session geschrieben und ausgelesen werden, fast wie bei jeder anderen Variablen in PHP.

Mittels isset() kann überprüft werden, ob dieser Wert gesetzt wurde. Wie das Beispiel oben es verdeutlicht, können auch Arrays einem Session-Wert zugewiesen werden. Hier sind also fast keine Grenzen gesetzt.

PHP kümmert sich selbst darum, dass nur die Session des aktuellen Benutzers betroffen ist.

Möchtest Du einen Session-Wert löschen, funktioniert das mit unset():

unset($_SESSION['benutzer']); // Session-Wert löschen

Auch eine ganze Session kann gelöscht werden:

session_unset();

PHP bietet außerdem eine Reihe von weiteren Session-Funktionen an, die eventuell hilfreich sein können. Achte allerdings darauf, dass Du keine Funktionen verwendest, die als DEPRECATED (veraltet) gekennzeichnet worden sind.

SessionID in der URL

Zum Glück immer seltener geworden ist die Übergabe der SessionID via URL statt per Cookie. Damit wurde an jede URL, die auf die eigene Seite verweist, eine SessionID angehängt, die sonst per Cookie ausgeliefert wird.

Da ich von dieser Variante nichts halte, werde ich nicht mehr weiter darauf eingehen. Nur so viel: Wer die URL kennt, kann sich auch der Sitzung bemächtigen.

Die Sessions anpassen

Über die PHP-Konfigurationsdatei php.ini kannst du zahlreiche Einstellungen vornehmen. Zum Teil auch über die PHP-Funktion ini_set(). Dafür muss diese mit den entsprechenden Parametern zu Beginn des Skriptes aufgerufen werden.

Die Entwickler von PHP bieten zahlreiche Einstellungsmöglichkeiten für das eigene Session-System an. Einige interessante Optionen trage ich nun hier zusammen:

  • session.name
    Mit dieser Einstellung kann der Name des Session-Cookies festgelegt werden. Standardmäßig ist das „PHPSESSID“.
  • session.auto_start
    Hier wird spezifiziert, ob automatisch ein Session-Cookie gespeichert werden soll, auch dann, wenn noch gar kein Wert gespeichert wurde. Standardmäßig „0“.
  • session.gc_maxlifetime
    Diese Option legt fest, nach wie vielen Sekunden Inaktivität eine Session gelöscht werden soll. Standard sind 1440 Sekunden, also 24 Minuten.
  • session.use_only_cookies
    Oben habe ich die Übertragung per URL bereits angesprochen. Mit dieser Option wird festgelegt, standardmäßig aktiviert, dass nur Cookies zum Speichern der SessionID verwendet werden.Außerdem gibt es einige session.cookie* Optionen, die beispielsweise die URL und Cookie-Laufzeit betreffen.
  • session.cache_expire
    Diese Option ist ähnlich wie gc_maxlifetime. Hiermit wird direkt die Cache-Verfallslaufzeit angegeben. Minuten ist die entsprechend Einheit und der Standard 180 Minuten.
  • session.referer_check
    Es gibt auch die Möglichkeit den Referer, also die zuvor aufgerufene Seite, auf einen ganz speziellen Wert hin zu untersuchen. Dieser kann hier hinterlegt werden. Nur, wenn er gefunden wurde, ist die Session gültig.
  • session.upload_progress.*
    Die Sessions können auch dazu verwendet werden, den Upload-Status einer Datei mittels AJAX und PHP anzuzeigen. Dafür ist diese Option hilfreich.

Sessions & Datenbank

Sessions sind zwar für den einzelnen Nutzer leicht zu verwalten, aber gerade wenn zum Beispiel die Benutzer gezählt werden sollen, längst nicht so gut einsetzbar wie eine Datenbank.

Deswegen kannst Du in einer Sitzung zum Beispiel die Benutzer ID speichern, die auch in der Datenbank hinterlegt ist. Weitere Daten zum Benutzer, etwa die E-Mail-Adresse, sollten dann in einer MySQL-Datenbank hinterlegt werden.

Hilfreich ist eine Session allerdings dann wenn es um kleinere Einstellungen geht. Zum Beispiel kann eine Option zum Ausschalten der mobilen Ansicht gut in einer Session gespeichert werden.

Fazit zu den Sessions in PHP

PHP bietet ein gut umgesetztes und umfangreiches Session-Konzept an. Damit können leicht Werte gesetzt und anschließend wieder abgefragt werden. Via php.ini können auch diverse Einstellungen für die Sessions und Session-Cookies vorgenommen werden.

In dem nächsten Teil dieses Tutorials beschäftigen wir uns dann noch einmal mit Cookies und dem PHP-Header.

4 Gedanken zu „10. Sessions in PHP“