2012-03-28 15 views
1

Ich muss eine sehr kurze Sitzung (3 Minuten) auf eine bestimmte Seite auf meiner Website zu treffen. Wenn jemand während dieser 3-minütigen Sitzung erneut auf diese Seite klickt, sollte die Sitzung aktualisiert werden und 3 Minuten später ablaufen.Zend_Session und Ablauf

Auf meinem „Bootstrap“ (es ist kein typisches Zend Bootstrap, aber es ist in jeder Seite enthalten), kann ich folgendes:

$aSessionSaveHandlerConfig = array 
(
    "name"   => "Sessions", 
    "primary"  => "Session_ID", 
    "modifiedColumn" => "UpdateTimestamp", 
    "dataColumn"  => "Data", 
    "lifetimeColumn" => "Lifetime", 
); 

$oSaveHandler = new Zend_Session_SaveHandler_DbTable($aSessionSaveHandlerConfig); 
$oSaveHandler->setLifetime(App::$ReservationTimeout)->setOverrideLifetime(true);  

Zend_Session::setSaveHandler($oSaveHandler); 

ini_set("session.cookie_lifetime",App::$ReservationTimeout); 

$aSessionOptions = array 
(
    "gc_probability" => 100, 
    "gc_divisor"  => 100, 
    "gc_maxlifetime" => App::$ReservationTimeout, 
    "cookie_lifetime" => App::$ReservationTimeout, 
); 

Zend_Session::setOptions($aSessionOptions); 

dann innerhalb der Seite, sollten erstellen/aktualisieren die Sitzung, die ich habe:

App::$ReservationSession = new Zend_Session_Namespace("ReservationSession"); 
$oSaveHandler = Zend_Session::getSaveHandler(); 
$oSaveHandler->setLifetime(App::$ReservationTimeout); 

ich die Datensätze in der Datenbank zu sehen, ist die Lebensdauer Spalte richtig, aber wenn ich immer wieder die Seite getroffen, die/aktualisiert die Sitzung erstellt, erhalte ich eine neue Session-ID nach 3 Minuten vergehen (und der andere wird nach der Garbage Collection entfernt.

Es scheint, dass das Problem darin besteht, dass der Cookie aktualisiert wird. Irgendwelche Ideen?

Antwort

3

Um das Sitzungscookie zum Aktualisieren der Ablaufzeit zu erhalten, können Sie Zend_Session::rememberMe() verwenden, um die Standardlebensdauer des Cookies zu ändern. Der Aufruf von rememberMe() bewirkt außerdem, dass Zend_Session::regenerateId() aufgerufen wird, der eine neue Sitzungs-ID generiert, alte Sitzungsdaten in die neue Sitzung kopiert und ein neues Sitzungs-Cookie an den Browser sendet.

den folgenden Code versuchen und sehen, ob es Ihr Problem löst:

App::$ReservationSession = new Zend_Session_Namespace("ReservationSession"); 
$oSaveHandler = Zend_Session::getSaveHandler(); 
$oSaveHandler->setLifetime(App::$ReservationTimeout); 

// Call remember me which will send a new session cookie with 3 minute expiration 
// from the current time. Old session data is copied to the new one and the old 
// session is deleted 
Zend_Session::rememberMe(App::$ReservationTimeout); 

den manuellen Siehe Abschnitt auf Session Identifiers für weitere Informationen oder auch How to reset a Zend rememberMe function on each automatic login?

UPDATE: Gegeben Ihren Kommentar, Ich habe diese Lösung entwickelt, die Sie verwenden können.

Sie starten Ihre Sitzung wie gewohnt und überprüfen dann einen Wert in der Sitzung, um festzustellen, ob der Benutzer eine vorhandene Sitzung hatte.

Wenn sie über eine Sitzung verfügen, verwendet sie setcookie(), um ein aktualisiertes Sitzungscookie unter Verwendung der vorhandenen Parameter (einschließlich Sitzungs-ID) zu senden, außer dass der Ablauf auf time() + $ReservationTimeout festgelegt wird. Wenn sie keine Sitzung hatten, ist es nicht notwendig, den Cookie zu aktualisieren, da der Ablauf bereits korrekt ist und bei der nächsten Anfrage aktualisiert wird (vorausgesetzt, sie besuchen, bevor sie abläuft).

App::$ReservationSession = new Zend_Session_Namespace("ReservationSession"); 
$oSaveHandler = Zend_Session::getSaveHandler(); 
$oSaveHandler->setLifetime(App::$ReservationTimeout); 

if (!isset(App::$ReservationSession->hasSession)) { 
    // user had no session before or it was expired 
    App::$ReservationSession->hasSession = true; 
} else { 
    // user has a valid session, update the cookie to expire 3 mins from now 
    $params = session_get_cookie_params(); 
    $expire = time() + App::$ReservationTimeout; 

    setcookie(session_name(), 
       Zend_Session::getId(), 
       $expire, 
       $params['path'], 
       $params['domain'], 
       $params['secure'], 
       $params['httponly']); 
} 

Getestet habe ich die Lösung, um die Dateien Session-Handler und es funktionierte wie erwartet, ich denke, es sollte auch für Ihre Situation in Ordnung sein.

+0

Awesome Erklärung, aber ich habe MySQL InnoDB Fremdschlüssel Einschränkungen mit der Session-ID, so ist es notwendig, die gleiche Session ID beim Aktualisieren der Zeitüberschreitung beizubehalten. Ist es möglich zu tun, was rememberMe macht, ohne die Session ID zu ändern? – Travis