2012-03-28 1 views
1

Je dois définir une session très courte (3 minutes) en cliquant sur une page spécifique sur mon site. Si quelqu'un renvoie à nouveau cette page pendant cette session de 3 minutes, la session doit être mise à jour pour expirer 3 minutes après cette date.Zend_Session et Expiration

Sur mon « bootstrap » (ce n'est pas une amorce Zend typique, mais il est inclus dans chaque page), je fais ce qui suit:

$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); 

Ensuite, dans la page qui devrait créer/mettre à jour le session, je:

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

Je vois les enregistrements dans la base de données, la colonne de durée de vie est correcte, mais si je frappe à plusieurs reprises la page qui crée/met à jour la session, je reçois une nouvelle ID session après 3 minutes passe (et l'autre est retiré après la récupération de place.)

Il semble que le problème consiste à obtenir le cookie pour mettre à jour son heure. Des idées?

Répondre

3

Pour que le cookie de session mette à jour son heure d'expiration, vous pouvez utiliser Zend_Session::rememberMe() pour modifier la durée de vie par défaut du cookie. L'appel rememberMe() provoquera également l'appel de Zend_Session::regenerateId() qui génère un nouvel ID de session, copie les anciennes données de session dans la nouvelle session et envoie un nouveau cookie de session au navigateur.

Essayez le code suivant et voir si cela résout votre problème:

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); 

Voir la section du manuel sur Session Identifiers pour plus d'informations, ou voir aussi How to reset a Zend rememberMe function on each automatic login?

MISE À JOUR: Compte tenu de votre commentaire, Je suis venu avec cette solution que vous pouvez utiliser. Cela permet de démarrer votre session comme d'habitude, puis de vérifier une valeur dans la session pour voir si l'utilisateur a déjà une session. S'ils ont une session, ils utilisent setcookie() pour envoyer un cookie de session mis à jour en utilisant les paramètres existants (y compris l'identifiant de session), sauf qu'il définit l'expiration sur time() + $ReservationTimeout. S'ils n'ont pas eu de session, il n'est pas nécessaire de mettre à jour le cookie car l'expiration est déjà correcte et elle sera mise à jour lors de leur prochaine demande (en supposant qu'ils se rendent avant son expiration). J'ai testé la solution à l'aide du gestionnaire de session de fichiers et cela a fonctionné comme prévu, je pense que cela devrait également convenir à votre situation.

+0

Explication géniale, mais j'ai des contraintes de clé étrangère MySQL InnoDB en utilisant l'ID de session, il est donc nécessaire de conserver le même ID de session lors de la mise à jour du délai. Est-il possible de faire ce que rememberMe fait sans changer l'identifiant de session? – Travis

Questions connexes