de.comp.lang.php.* FAQ

29.10. Was geschieht im Filesystem des Servers, wenn ich Sessions benutze?

Antwort von Daniel T. Gorski

Damit der Vorgang der Sessionspeicherung ein wenig verdeutlicht wird, untersuchen wir die Veränderungen im Filesystem des Servers. Die folgenden Beispiele laufen auf einem Linux/Unixsystem. Um sie nachvollziehen zu können, muss PHP4 mit safe_mode =Off konfiguriert werden. Zusätzlich wird davon ausgegangen, dass der Client (Browser) Cookies akzeptiert.

Als allererstes braucht man ein Script, welches den Inhalt des im session.save_path festgelegten Directories anzeigen kann:

<?php
    // Datei: list.dir.php
    // Liste das "session.save_path" Directory
    // "safe_mode" muss "Off" sein
    if (strtolower(session_module_name()) == "files")
        {
            echo "<pre>";
            system("ls -l " . session_save_path());
            echo "</pre>";
        }
?>

Dieses Script wird unter dem Namen list.dir.php gespeichert. Hat man z.B. Shell-Zugriff auf den benötigten Teil des Servers, führt natürlich auch ein einfaches ls -l /tmp zu der von list.dir.php produzierten Ausgabe.

Das obige Script wird ausgeführt, um den Ursprungszustand des im session.save_path gespeicherten Verzeichnisses zu betrachten. Zunächst produziert das Script folgendes:

Ausgabe (mit list.dir.php):

    insgesamt 0
    srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock

Das Verzeichnis (in diesem Fall /tmp) ist fast leer. Die Datei mysql.sock kann für unseren Zweck vernachlässigt werden.

Als nächstes schreibt man ein Script, welches nach und nach ergänzt oder verändert wird, um die Veränderungen im Filesystem zu beobachten. Der Name diese Scriptes sei session.php. Dieses Script enthält nur die Funktion session_start() . Nach dem Start beobachten wir die Veränderungen:

<?php
    // Datei: session.php
    @session_start();
?>

Ausgabe (mit list.dir.php):

    insgesamt 0
    srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock
    -rw-------    1 wwwrun   www    0 Okt  1 17:58 sess_cd45a3f76f73250..

Wie man sehen kann, hat PHP eine Sessiondatei mit den Zugriffsrechten des Webservers erzeugt, dessen Prozess es ja ist. Diese Datei ist zunächst 0 (Null) Byte groß. Diese Datei wird gleich die Sessiondaten aufnehmen.

Als nächstes wird in dem Script auf die Sessionvariablen zugegriffen, wodurch diese automatisch erstellt werden.

<?php
//  Datei: session.php
    @session_start();

    $_SESSION['userName']        = "dtg";
    $_SESSION['userPermissions'] = "keine :=(";
?>

Ausgabe (mit list.dir.php):

    insgesamt 4
    srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock
    -rw-------    1 wwwrun   www   55 Okt  1 17:58 sess_cd45a3f76f73250..

Die Sessiondatei ist nun auf 51 Byte angewachsen. Sie enthält folgenden String:

    userName|s:3:"dtg";userPermissions|s:9:"keine :=(";

also die serialisierten ( serialize() ) Namen und Inhalte der Variablen, die mit session_register() bestimmt wurden. In den Sessiondaten können verschiedene Variablentypen gespeichert werden, also auch Arrays und Objekte.

Wenn man jetzt auf eine Variable in der Sessiondatei verzichten will, kann man mittels unset() PHP davon abhalten, die betreffende Variable zu speichern:

<?php
    // Datei: session.php
    @session_start();
    unset($_SESSION['userPermissions']);

?>

Ausgabe (mit list.dir.php):

    insgesamt 4
    srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock
    -rw-------    1 wwwrun   www   21 Okt  1 17:59 sess_cd45a3f76f73250..

Die Variable $_SESSION['userPermissions'] wurde verworfen, die Sessiondatei ist nur noch 19 Byte groß und enthält nur noch die Variable $_SESSION['userName']:

    userName|s:3:"dtg";

Möchte man nun alle Sessiondaten löschen, stellt PHP4 die Funktion session_destroy() zur Verfügung. Vor einem session_destroy() muss aber ein session_start() ausgeführt werden:

<?php
    // Datei: session.php
    @session_start();
    session_destroy();
?>

Ausgabe (mit list.dir.php):

    insgesamt 0
    srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock

Die Sessiondatei wurde gelöscht und die Sessionvariablen stehen für weitere Scripte nicht mehr zur Verfügung. Wird nach diesem Zeitpunkt nochmals die Funktion session_start() im gleichen Browserfenster aufgerufen, wird die Sessiondatei erneut erzeugt, und zwar u.U. mit dem gleichen Namen d.h. mit der gleichen Session-ID(!). Der Grund dafür ist, dass der vom Browser gespeicherte Cookie - der die Session-ID enthält - erneut an den Server übermittelt wird.

Valid HTML 4.01! Valid CSS!

29.10. Was geschieht im Filesystem des Servers, wenn ich Sessions benutze?
http://www.php-faq.de/q/q-sessions-dateisystem.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team