PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Session Variablen / Session lifetime


morsche
13.10.2005, 00:53:09
morsche,

isch hab ein Problem:
Ziel ist es, bestimmte userspezifische Daten über einen Zeitraum von 90 Tagen zu speichern (History von Suchanfragen). Mittels session_set_cookie_params() habe ich entsprechend die Lebenszeit der Session-Cookies auf 60*60*24*90 gesetzt.

Soweit so gut. Im Prinzip funktioniert alles - die Variablen werden zunächst gespeichert und wie gewünscht ausgegeben, aber nach einem mir noch unbekannten Zeitraum (definitiv weniger als 90, eher ein paar Tage) sind die Variablen futsch und ich weiß nicht, warum.

Anhand dessen, was ich bisher gelesen habe, dürfte es auch nicht an der standardmäßig auf 180 Min. eingestellten session_cache_expire()-Zeit liegen.

Ich habe früher ausschließelich mit Perl und nicht sonderlich viel mit Sessions gearbeitet und wenn, dann auf eine andere Weise. Ich habe es mir mittlerweile nach vielem Hin und Her angewöhnt, die Sessions nicht in der Datenbank abzulegen, sondern einfach die Variablen in der Session zu speichern und dann direkt abzufragen. Wenn es daran liegt, also dass ich die Variablen besser in der Datenbank speichern sollte, sagt es mir :).
Es würde mich interessieren, ob es generell sinnvoller ist, die Variablen in der Datenbank zu speichern und mittels der SessionID darauf zurückzugreifen - dies erschien mir nämlich bisher immer etwas zu aufwendig, falls die zu speichernden Daten nicht weiter relevant sind und auch nicht aufbewahrt werden müssen (außer für den Anwender).

Also, lange Rede, kurzer Sinn - hat jemand eine Idee?

thx und Grüße

meikel (†)
13.10.2005, 05:36:59
Ziel ist es, bestimmte userspezifische Daten über einen Zeitraum von 90 Tagen zu speichern (History von Suchanfragen). Mittels session_set_cookie_params() habe ich entsprechend die Lebenszeit der Session-Cookies auf 60*60*24*90 gesetzt.

Soweit so gut. Im Prinzip funktioniert alles - die Variablen werden zunächst gespeichert und wie gewünscht ausgegeben, aber nach einem mir noch unbekannten Zeitraum (definitiv weniger als 90, eher ein paar Tage) sind die Variablen futsch und ich weiß nicht, warum.
session.gc_maxlifetime möchte auch so lange leben wie der Session-Keks.

Ich habe es mir mittlerweile nach vielem Hin und Her angewöhnt, die Sessions nicht in der Datenbank abzulegen, sondern einfach die Variablen in der Session zu speichern und dann direkt abzufragen. Wenn es daran liegt, also dass ich die Variablen besser in der Datenbank speichern sollte, sagt es mir :).
Du solltest mal daran denken:
session_set_save_handler -- Setzt benutzerdefinierte Session-Speicherfunktionen

Im Handbuch findest Du in den Userkommentaren Beispiele, wie man die Session anstelle in einem Sessionfile in einer Datenbank speichern kann. Beachte dabei ebenfalls die Userkommentare zu serialize(), damit Du mit der neu zu schreibenden Funktion write() den Inhalt von $_SESSION unabhängig vom Inhalt komplett und ohne Stringfehler in die Datenbank schreibst und zurücklesen kannst.

Bevor Du fragst: es funktioniert bestens.

morsche
13.10.2005, 14:04:06
Hört sich vielversprechend an, aber bevor ich mir damit Arbeit mache, versuche ich es erstmal mit session.gc_maxlifetime. Denn die Grundfunktionalität ist ja gegeben und wenn es über einen Zeitraum von ein paar Stunden oder paar Tagen gespeichert werden kann, dann dürfte eine Erweiterung auf 90 Tage wohl auch kein Problem sein.

Falls es nicht klappt, versuche ichs mal mit session_set_save_handler. Aber wenn ich nicht muss, möchte ich es auch nicht in der DB speichern.

morsche
14.10.2005, 13:47:12
leider funktioniert es nicht, wie ich es bisher probiert habe:

$expireTime = 60*60*24*50;

ini_set('session.use_cookies', true);
ini_set('session.gc_maxlifetime', time() + $expireTime);
ini_set('session.cookie_lifetime', time() + $expireTime);
ini_set('session.serialize_handler', 'php');
ini_set('session.gc_probability', 1);

session_set_cookie_params($expireTime);

session_start();


(hab's vorher ohne time() versucht, wie ich es eigentlich für richtig hielt. Dann habe ich es aber so gefunden und direkt übernommen. Da es aber bei session_set_cookie_params() auch nur ohne time() geht, könnte es ja sein, dass es bei dem entsprechenden ini_set Befehl auch nicht funktioniert.)

Ich frage mich, wieso sich keine Änderung bemerkbar macht - müsste doch eigentlich funktionieren, oder?

Ich würde wie gesagt gerne die DB Lösung umgehen. Gibt es noch andere Lösungsansätze oder Fehlerquellen, die ich beachten muss?

THX

meikel (†)
14.10.2005, 15:45:38
Ich frage mich, wieso sich keine Änderung bemerkbar macht - müsste doch eigentlich funktionieren, oder?
Ich kenne mein phpinfo aber nicht Deins.

bei ini_set() solltest Du prüfen, ob PHP die Änderungen überhaupt übernommen hat. Fehlermeldungen, wenn ggf. der safe_mode was dagegen hat oder im virtualhost per php_admin_* Variablen durch den Provider zwingend gesetzt werden, werden bei ini_set() nicht angemeckert.