PHP 4 verfügt – im Gegensatz zu PHP 3 – über einen ganzen Satz an Funktionen, die das Handling von Sessiondaten erleichtern. Möchte man mit PHP 3 Sessions nutzen, so ist man mit der PHPLIB gut beraten.
Ab der PHP Version 4.1.0 wurden die sog. superglobalen Hashes eingeführt. Somit gelten die $HTTP_*_VARS als veraltet, obwohl sie per Schalter in der php.ini noch aktiviert werden können, um die Kompatibilität mit älteren Scripten zu gewährleisten. Anstatt $HTTP_SESSION_VARS ist in neueren PHP Versionen $_SESSION zu benutzen.
Die wichtigsten PHP 4-Sessionfunktionen mit ihrer Auswirkung seien hier kurz vorgestellt:
- session_start()
- session_register()
- session_unregister()
- session_destroy()
session_start()
Die Session initialisieren und eine Session(datei) auf dem Server erstellen. Wurde beim Request eine gültige Session-ID übergeben, werden die in den Sessiondaten gespeicherten Werte in dem $HTTP_SESSION_VARS-Hash wiederhergestellt und abhängig von der Einstellung der register_globals auch als Variablen im laufendem Script reinitialisiert.
Manche PHP 4-Versionen enthalten einen Bug, der bei der php.ini -Einstellung register_globals=off, den $HTTP_SESSION_VARS-Hash nicht richtig wiederherstellen. Bei einen Verdacht auf eine Fehlfunktion könnte diese Einstellung auf on geändert werden und u.U. der Webserver neu gestartet werden.
Zusätzlich werden, je nach Einstellung des session.gc_probability- und des session.gc_maxlifetime-Parameters, die in dem Augenblick der Sessioninitialisierung angehäuften und nicht mehr benötigten Sessiondateien auf dem Server gelöscht.
Wenn das error_reporting() schärfer eingestellt ist, gibt session_start() bei älteren PHP 4-Versionen eine Notice aus, wenn die Garbage Collection – das Löschen alter Sessiondateien – durchgeführt wird. Da diese Notice nicht erwünscht ist, empfiehlt es sich vor die session_start()-Funktion ein “@” zu schreiben, welches die entsprechende Ausgabe unterdrückt.
<?php     @session_start(); ?>
Bei der Entwicklung einer sessionbasierten Applikation sollte man einen besonderen Augenmerk auf den “@” Operator richten, da das “@” auch einen beliebten Programmierfehler unterdrückt, der dann schlecht aufzuspüren ist.
session_register()
Eine oder mehrere Variablen zur Speicherung in die Session(datei) vormerken. session_register() impliziert ein session_start(). Das bedeutet, daß man session_start() in diesem Fall auch weglassen könnte. Bei den Parametern der session_register() Funktion handelt es sich nicht um die Variablen selbst, sondern um ihre Namen. Diese Parameter besitzen kein führendenes “$”.
session_register() merkt eine Variable vor (registriert sie), die dann am Ende des Scriptes in die Session(datei) geschrieben wird, und die zwischen dem Registrieren und dem Scriptende verschiedene Werte haben kann. Es wird jeweils der letzte Wert dieser Variablen in den Sessiondaten gespeichert. D.h. Die Werte der registrierten Variablen sind frühestens, nach der Beendigung des aktuellen Scriptes und beim nächsten session_start() wieder verfügbar.
<?php     $var1 = 'variable #1';     $var2 = 42;     $var3 = true;     @session_start();     session_register('var1');     session_register('var2', 'var3'); ?>
session_unregister()
Eine oder mehrere Variablen aus der Session(datei) verwerfen. Dem session_unregister() muß ein session_start() oder session_register() vorangehen.
<?php     @session_start();     session_unregister('var1'); ?>
session_destroy()
Die Funktion session_destroy() veranlasst PHP alle Variablen einer Session zu verwerfen und die Session(datei) löschen. Dem session_destroy() muss ebenfalls ein session_start() oder session_register() vorangehen.
<?php     @session_start();     session_destroy(); ?>
Manche Portierungen von PHP 4 für windowsbasierte Betriebssysteme haben Probleme mit der Löschung von Sessiondateien und melden: “Warning: Session object destruction failed …”. In diesem Fall kann man mittels des folgenden Scriptes die Sessiondatei “manuell” löschen:
<?php     @session_start();     @session_destroy();  /* könnte fehlschlagen */     if (strtolower(session_module_name()) == 'files') {         @unlink(             get_cfg_var('session.save_path')             .'/sess_'             .session_id()         );     } ?>
Dieses Script löscht die Sessiondatei aus dem Filesystem, sodaß beim erneuten Zugriff keine Daten wiederhergestellt werden können.
Merke:
- Registrierte Variablen werden am Ende eines Scriptes in die Session(datei) geschrieben.
- Sie können zwischen dem Registrieren und dem Scriptende verschiedene Werte haben.
- Der Zugriff auf registrierte Variablen ist erst wieder nach einem session_start() möglich.