Fragen zu Session Handling mit PHP
Benedikt
- php
Hallo,
ich habe trotz dem Durchforsten einiger Forenbeiträge einige Unklarheiten zum Session Handling in PHP:
ini_set("session.use_trans_sid","1");
ini_set("session.use_cookies","1");
ini_set("session.gc_probability","100");
ini_set("session.gc_divisor","1");
ini_set("session.gc_maxlifetime","1");
session_start();
$_SESSION['x'] = 120;
echo "<a href='index.php'>reload</a><br />";
echo $_SESSION['x'];
session_destroy();
Frage1: ich überüfe die Gültigkeit eines Login dadurch dass ich die Differenz von jetziger Zeitpunkt abzgl. Zeitpunkt letzter Aktivität mit der Dauer des SessionTimeout vergleiche. Wenn ich die Dauer des SessionTimeout bspw. auf 2 Std. setze, ist es dann möglich, dass trotzdem die Session nicht mehr vorhanden ist, da session.gc_maxlifetime standardmäßig auf 24min gesetzt ist?
Frage2: der obige Code gibt immer die Zahl 120 aus und die Session Id bleibt die gleiche. Obwohl doch die physische Sessiondatei mit einer Wahrscheinlichkeit von 100% gelöscht werden sollte, da die maxlifetime auf 1 begrenzt wurde.
Frage3: zumindest sollte doch session_destroy die Session zerstören. Erfolgt aber nicht. Ist das eine mit der Session zusammenhängende globale Variable? Den lt. dem php manuel werden diese nicht gelöscht.
Danke und viele Grüße
Benedikt
echo $begrüßung;
Frage1: ich überüfe die Gültigkeit eines Login dadurch dass ich die Differenz von jetziger Zeitpunkt abzgl. Zeitpunkt letzter Aktivität mit der Dauer des SessionTimeout vergleiche. Wenn ich die Dauer des SessionTimeout bspw. auf 2 Std. setze, ist es dann möglich, dass trotzdem die Session nicht mehr vorhanden ist, da session.gc_maxlifetime standardmäßig auf 24min gesetzt ist?
Die von dir berechneten Zeiten spielen bei PHPs Session-Handling keine direkte Rolle. PHP nimmt die Zeit des letzten modifizierenden Zugriffs der Session-Datei.
Besonders wenn du dir den session.save_path mit anderen teilst, kann es passieren, dass andere Einstellungen für die Session-Zeiten verwenden werden. Die von dir geänderten Werte gelten nur für den Garbage-Collector, der von deinem session_start() aufgerufen wird.
Frage2: der obige Code gibt immer die Zahl 120 aus und die Session Id bleibt die gleiche. Obwohl doch die physische Sessiondatei mit einer Wahrscheinlichkeit von 100% gelöscht werden sollte, da die maxlifetime auf 1 begrenzt wurde.
Die Session-ID wird noch aus deinem alten Cookie stammen, das noch nicht abgelaufen ist. Durch das explizite Setzen des Wertes kann auch kein anderer Wert als 120 rauskommen. Es sei denn, du hast die Zeile beim zweiten Aufruf rausgenommen, dann wäre die Ursache höchstwahrscheinlich eine andere.
Frage3: zumindest sollte doch session_destroy die Session zerstören. Erfolgt aber nicht. Ist das eine mit der Session zusammenhängende globale Variable? Den lt. dem php manuel werden diese nicht gelöscht.
session_destroy() räumt die Session nicht rückstandsfrei weg. Beispielsweise bleibt das Session-Cookie erhalten. Fortsetzung siehe Frage 2.
echo "$verabschiedung $name";
Hallo,
Vielen Dank erstmal für deine Antwort.
Leider sind meine Unklarheiten noch nicht ganz ausgeräumt:
Wenn ich dich richtig verstanden habe, so ist es möglich das die PHP GC meine Sessiondateien aufräumt, bevor ich mit meinem intern implementierten Mechanismus feststelle das die Session abgelaufen ist.
bei meinem vorigen Bsp. liegt die Ursache nachweislich nicht an einem alten Session-Cookie. Ich hab nochmal ein Bsp. gebastelt, das meine Verständnisprobleme verdeutlicht:
session_start();
$_SESSION['x'] = 120;
echo "<a href='index.php'>reload</a><br />";
echo $_SESSION['x'];
session_destroy();
echo $_SESSION['x'];
$_SESSION = array();
echo $_SESSION['x'];
Die Datei die den Code enthält ruft sich praktisch selber auf und gibt 120120 aus (und das jedesmal unter der gleichen SessionId!).
Die erste Ausgabe ist klar nachvollziehbar, die zweite auch noch da ich gelesen habe das Session-Daten auch nach einem session_destroy() noch bis zum Ende verfügbar sind. Das dritte echo liefert keine Ausgabe mehr, da ich das Session-Array gelerrt habe.
Wenn ich nun aber auf reload klicke, dann ist die gleiche SessionId wieder an den Link angehängt, obwohl doch diese Session zerstört wurde, oder? Das verstehe ich nicht!
Danke für eure Hilfe
Viele grüße
Benedikt
hi,
- Wenn ich dich richtig verstanden habe, so ist es möglich das die PHP GC meine Sessiondateien aufräumt, bevor ich mit meinem intern implementierten Mechanismus feststelle das die Session abgelaufen ist.
Die garbage collection ist selbstverständlich vollkommen unabhängig davon, was du scriptintern an "Feststellendem" implementierst.
Wenn die Session-Datei vom GC bereits entsorgt wurde - dann _hast_ du in deinem Script gar nichts mehr, was du auf Ablauf überprüfen könntest.
Wenn ich nun aber auf reload klicke, dann ist die gleiche SessionId wieder an den Link angehängt, obwohl doch diese Session zerstört wurde, oder? Das verstehe ich nicht!
Das Manual beschreibt, was session_destroy() tut -
session_destroy() löscht alle in Verbindung mit der aktuellen Session stehenden Daten.
Mit der Session zusammenhängende globale Variablen und das Session-Cookie werden nicht gelöscht.
gruß,
wahsaga
Hallo,
herzlichen Dank für diese Antwort.
Jetzt ist es mir klar.
Das in der URL noch die SessionId vorhanden ist, ist ja völlig belanglos und sagt nichts darüber aus ob die Session vorhanden ist oder nicht. Wichtig ist ja was in der Session drin steht.
viele Grüße
Benedikt