XCII. Session Funktionen

Die Unterstützung von Sessions in PHP bietet die Möglichkeit, bestimmte Daten während einer Folge von Aufrufen Ihrer Website festzuhalten. Damit können Sie persönlichere Applikationen erstellen und Ihre Website ansprechender gestalten.

Falls Sie mit dem Sessionmanagment von PHPLIB vertraut sind, werden Sie Ähnlichkeiten zu PHPs Session-Unterstützung feststellen.

Einem Besucher wird beim Aufruf Ihrer Website eine einzigartige ID, die sogenannte Session-ID, zugeordnet. Diese wird entweder benutzerseitig in einem Cookie abgelegt oder in der URL übermittelt.

Die Unterstützung von Sessions erlaubt Ihnen, eine beliebige Anzahl von Variablen zu registrieren und diese über Anfragen hinweg zu erhalten. Wenn ein Besucher Ihre Website aufruft, überprüft PHP automatisch (falls session.auto_start auf 1 gesetzt ist) oder auf Anfrage (explizit durch session_start() oder implizit durch session_register()), ob mit der Anfrage schon eine bestimmte Session-ID gesendet wurde. Wenn dies der Fall ist, wird die zuvor gespeicherte Umgebung wiederhergestellt.

Alle registrierten Variablen werden serialisiert, nachdem die Anfrage beendet ist. Registrierte Variablen, die nicht definiert sind, werden als nicht definiert gekennzeichnet. Auch bei darauffolgenden Zugriffen werden sie nicht vom Session-Modul definiert, außer der Benutzer definiert sie später.

Die Konfigurationseinstellungen von track_vars und register_globals beeinflussen, wie die Session-Variablen gespeichert und wiederhergestellt werden.

Anmerkung: Seit PHP 4.0.3 ist track_vars immer aktiviert.

Anmerkung: Seit PHP 4.1.0 steht $_SESSION genau wie $_POST, $_GET, $_REQUEST und so weiter, als globale Variable zur Verfügung. Im Gegensatz zu $HTTP_SESSION_VARS ist $_SESSION immer global. Deshalb sollte global nicht für $_SESSION verwendet werden.

Falls track_vars aktiviert und register_globals deaktiviert ist, können nur Bestandteile des globalen assoziativen Arrays $HTTP_SESSION_VARS als Session-Variablen registriert werden. Wiederhergestellte Session-Variablen stehen nur im Array $HTTP_SESSION_VARS zur Verfügung.

Beispiel 1. Registrierung einer Variablen bei aktiviertem track_vars

<?php
if (isset($HTTP_SESSION_VARS['zaehler'])) {
   $HTTP_SESSION_VARS['zaehler']++;
}
else {
   $HTTP_SESSION_VARS['zaehler'] = 0;
}
?>

Aus Gründen der Sicherheit und der Lesbarkeit des Codes wird die Verwendung von $_SESSION (oder $HTTP_SESSION_VARS bei PHP 4.0.6 oder niedriger) empfohlen. Mit $_SESSION oder $HTTP_SESSION_VARS werden die Funktionen session_register()/session_unregister()/session_is_registered() nicht benötigt. Der Benutzer kann auf die Session-Variable wie auf eine normale Variable zugreifen.

Beispiel 2. Registrierung einer Variablen mit $_SESSION.

<?php
// Verwenden Sie bei PHP 4.0.6 oder niedriger $HTTP_SESSION_VARS
if (!isset($_SESSION['zaehler'])) {
    $_SESSION['zaehler'] = 0;
} else {
    $_SESSION['zaehler']++;
}
?>

Beispiel 3. Aufheben der Registrierung einer Variablen mit $_SESSION.

<?php
// Verwenden Sie bei PHP 4.0.6 oder niedriger $HTTP_SESSION_VARS
unset($_SESSION['zaehler']);
?>

Wenn register_globals aktiviert ist, können alle globalen Variablen als Session-Variablen registriert werden und die Session-Variablen werden als entsprechende globale Variablen wiederhergestellt. Da PHP wissen muss, welche globalen Variablen als Session-Variablen registriert sind, muss der Benutzer Variablen mit der Funktion session_register() registrieren, während $HTTP_SESSION_VARS/$_SESSION die Verwendung von session_register() nicht benötigt.

Achtung

Wenn Sie $HTTP_SESSION_VARS/$_SESSION verwenden und register_globals deaktivieren, sollten Sie session_register(), session_is_registered() und session_unregister() nicht verwenden.

Wenn Sie register_globals aktivieren, sollten Sie session_unregister() verwenden, weil beim Deserialisieren von Session-Daten die Session-Variablen als globale Variablen registriert werden. Die Deaktivierung von register_globals ist sowohl aus Sicherheitsgründen als auch wegen der Performance empfehlenswert.

Beispiel 4. Registrierung einer Variablen bei aktiviertem register_globals

<?php
if (!session_is_registered('zaehler')) {
    session_register("zaehler");
    $zaehler = 0;
}
else {
    $zaehler++;
}
?>

Wenn sowohl track_vars als auch register_globals aktiviert sind, dann referenzieren die globalen Variablen und die Einträge von $HTTP_SESSION_VARS/$_SESSION für bereits registrierte Variablen den selben Wert.

Wenn der Benutzer session_register() verwendet, um eine Session-Variable zu registrieren, befindet sich diese Variable nicht vor dem nächsten Laden aus dem Sessionspeicher (d.h. bei der nächsten Anfrage) im Array von $HTTP_SESSION_VARS/$_SESSION.

Es gibt zwei Methoden, eine Session-ID zu übermitteln:

  • Cookies

  • URL Parameter

Das Session-Modul unterstützt beide Methoden. Cookies sind optimal, aber da sie nicht zuverlässig sind (Clients müssen sie nicht unbedingt akzeptieren), können wir uns nicht auf sie verlassen. Die zweite Methode hängt die Session-ID direkt an die URLs.

Wenn PHP mit --enable-trans-sid kompiliert wurde, kann es dies transparent machen. Wenn Sie diese Option aktivieren, werden relative URIs automatisch geändert, sodass sie die Session-ID enthalten. Alternativ können Sie die Konstante SID verwenden, die definiert wird, falls vom Client keinen passendes Cookie gesendet wurde. SID hat entweder die Form session_name=session_id oder ist eine leere Zeichenkette.

Das folgende Beispiel demonstriert, wie eine Variable registriert wird und wie unter Verwendung einer SID korrekt auf eine andere Seite verwiesen wird.

Beispiel 5. Zählen der Seitenaufrufe eines einzelnen Benutzers

<?php
if (!session_is_registered('zaehler')) {
    session_register('zaehler');
    $zaehler = 1;
}
else {
    $zaehler++;
}
?>

Hallo Besucher, Sie haben diese Seite <?php echo $zaehler; ?> Mal
aufgerufen.<p>

<?php
# für den Fall, dass der Benutzer Cookies deaktiviert hat,
# ist das <?php echo SID?> nötig, um die Session-ID zu erhalten
# (wenn die Option short tag aktiviert ist, kann <?=SID?> verwendet
# werden)
?>

Hier gehts <A HREF="nextpage.php?<?php echo SID?>">weiter</A>

Das <?=SID?> ist nicht nötig, wenn PHP mit --enable-trans-sid kompiliert wurde.

Anmerkung: Bei nichtrelativen URLs wird davon ausgegangen, dass sie auf externe Seiten zeigen und, weil es ein Sicherheitsrisiko wäre, die SID an einen anderen Server zu übermitteln, von daher wird keine SID angehängt.

Wenn Sie die Speicherung in einer Datenbank oder irgendeine andere Art der Speicherung realisieren wollen, können Sie session_set_save_handler() verwenden, um eine Reihe von benutzerdefinierten Speicherfunktionen zu erzeugen.

Das Sessionmanagementsystem unterstützt eine Anzahl von Konfigurationsoptionen, die Sie in Ihrer php.ini setzen können. Wir geben Ihnen dazu einen kleinen Überblick.

  • session.save_handler definiert den Namen der Prozedur, die benutzt wird, um die Daten zu speichern und zurückzuholen, die mit der Session in Verbindung stehen. Grundeinstellung files.

  • session.save_path definiert das Argument, das an die Speicherprozedur übergeben wird. Wenn Sie die standardmäßige files Prozedur wählen, ist das der Pfad, unter dem die Dateien erzeugt werden. Grundeinstellung /tmp. Wenn die Verzeichnistiefe von session.save_path größer als zwei ist, wird die Garbage-Collection nicht durchgeführt.

    Warnung

    Wenn Sie ein Verzeichnis gewählt haben, für das jeder Leserechte hat, wie das z.B. bei /tmp (Grundeinstellung) der Fall ist, könnten andere Serverbenutzer mit Hilfe der Dateiliste dieses Verzeichnisses Ihre Sessions entführen.

  • session.name spezifiziert den Namen der Session, der als Cookie-Name verwendet wird. Grundeinstellung PHPSESSID.

  • session.auto_start spezifiziert, ob das Session-Modul zu Beginn einer Anfrage automatisch eine Session startet. Grundeinstellung 0 (deaktiviert).

  • session.cookie_lifetime spezifiziert die Cookie-Lebensdauer, die an den Browser geschickt wird, in Sekunden. Der Wert 0 bedeutet "bis der Browser geschlossen wird." Grundeinstellung 0.

  • session.serialize_handler definiert den Namen der Prozedur, die benutzt wird, um Daten zu serialisieren/deserialisieren. Gegenwärtig wird ein internes PHP-Format (Name php) und WDDX (name wddx) unterstützt. WDDX steht nur zur Verfügung, wenn PHP mit WDDX support kompiliert wurde. Grundeinstellung php.

  • session.gc_probability spezifiziert die prozentuale Wahrscheinlichkeit, dass die gc (garbage collection) Routine bei jeder Anfrage gestartet wird. Grundeinstellung 1.

  • session.gc_maxlifetime spezifiziert die Anzahl der Sekunden, nach denen Daten als 'garbage' ('Müll') betrachtet und entsorgt werden.

  • session.referer_check enthält die Zeichenkette, auf die Sie jeden HTTP-Referer überprüfen wollen. Wenn der Referer vom Client gesendet und die Zeichenkette nicht gefunden wurde, wird die eingebettete Session-ID als ungültig gekennzeichnet. Grundeinstellung ist eine leere Zeichenkette.

  • session.entropy_file gibt den Pfad zu einer externen Quelle (Datei) an, die bei der Erzeugung einer Session-ID als zusätzliche Entropiequelle verwendet wird. Beispiele sind /dev/random oder /dev/urandom, die auf vielen Unix-Systemen zur Verfügung stehen.

  • session.entropy_length spezifiziert die Anzahl der Bytes, die von der oben spezifizierten Datei gelesen werden. Grundeinstellung 0 (deaktiviert).

  • session.use_cookies spezifiziert, ob das Modul Cookies verwendet, um die Session-ID clientseitig zu speichern. Grundeinstellung 1 (aktiviert).

  • session.cookie_path spezifiziert den Pfad, in dem das Session-Cookie gesetzt wird. Grundeinstellung /.

  • session.cookie_domain spezifiziert die Domain, unter der das Session-Cookie gesetzt wird. In der Grundeinstellung überhaupt keine.

  • session.cache_limiter spezifiziert die Methode der Cacheverwaltung, die bei Session-Seiten benutzt wird (none/nocache/private/private_no_expire/public). Grundeinstellung nocache.

  • session.cache_expire spezifiziert in Minuten, wie lange Session-Seiten im Cache bleiben. Bei nocache ist diese Angabe wirkungslos. Grundeinstellung 180.

  • session.use_trans_sid bestimmt, wenn mit --enable-trans-sid kompiliert wurde, ob transparente SID-Unterstützung aktiviert ist oder nicht. Grundeinstellung 1 (aktiviert).

  • url_rewriter.tags bestimmt, wenn Unterstützung für transparente SID aktiviert ist, welche HTML-Tags so umgeschrieben werden, dass sie die Session-ID beinhalten. Grundeinstellung a=href,area=href,frame=src,input=src,form=fakeentry

Anmerkung: Die Behandlung von Sessions wurde in PHP 4.0 eingeführt.

Inhaltsverzeichnis
session_cache_expire -- Liefert die aktuelle Cache-Verfallszeit
session_cache_limiter --  Liefert und/oder setzt die aktuelle Cacheverwaltung
session_decode --  Dekodiert die Daten einer Session aus einer Zeichenkette
session_destroy --  Löscht alle in einer Session registrierten Daten
session_encode --  Kodiert die Daten der aktuellen Session als Zeichenkette
session_get_cookie_params --  Liefert die Session-Cookie Parameter
session_id --  Liefert und/oder setzt die aktuelle Session-ID
session_is_registered --  Überprüft, ob eine Variable in einer Session registriert ist
session_module_name --  Liefert und/oder setzt das aktuelle Session-Modul
session_name --  Liefert und/oder setzt den Namen der aktuellen Session
session_readonly --  Begin session - reinitializes freezed variables, but no writeback on request end
session_register --  Registriert eine oder mehrere Variablen in der aktuellen Session
session_save_path --  Liefert und/oder setzt den aktuellen Speicherpfad der Session
session_set_cookie_params --  Setzt die Session-Cookie Parameter
session_set_save_handler --  Setzt benutzerdefinierte Session-Speicherfunktionen
session_start -- Initialisiert eine Session
session_unregister --  Hebt die Registrierung einer Variablen in der aktuellen Session auf
session_unset --  Befreit alle Session-Variablen
session_write_close --  Speichert die Session-Daten und beendet die Session