1

在点击我网站上的特定页面时,我需要设置一个非常短的会话(3 分钟)。如果有人在该 3 分钟会话期间再次点击该页面,则会话应更新为从该时间起 3 分钟过期。

在我的“引导程序”(它不是典型的 Zend 引导程序,但它包含在每个页面中)上,我执行以下操作:

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

然后在应该创建/更新会话的页面中,我有:

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

我看到数据库中的记录,生命周期列是正确的,但是如果我反复点击创建/更新会话的页面,我会在 3 分钟后得到一个新的会话 ID(另一个在垃圾收集后被删除。

看来问题是让 cookie 更新它的时间。有任何想法吗?

4

1 回答 1

3

要让会话 cookie 更新其过期时间,您可以使用Zend_Session::rememberMe()来更改 cookie 的默认生命周期。调用rememberMe()也会导致Zend_Session::regenerateId()被调用,它会生成一个新的会话 ID,将旧的会话数据复制到新的会话,并将一个新的会话 cookie 发送到浏览器。

试试下面的代码,看看能不能解决你的问题:

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

有关更多信息,请参阅会话标识符的手册部分,或另请参阅如何在每次自动登录时重置 Zend rememberMe 功能?

更新: 鉴于您的评论,我想出了这个您可以使用的解决方案。

这样做是照常启动会话,然后检查会话中的值以查看用户是否有现有会话。

如果他们确实有会话,它使用setcookie()使用现有参数(包括会话 id)发送更新的会话 cookie,但它将过期设置为time() + $ReservationTimeout. 如果他们没有会话,则无需更新 cookie,因为过期已经正确,它将在他们的下一次请求时更新(假设他们在过期之前访问)。

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']);
}

我使用文件会话处理程序测试了解决方案,它按预期工作,我认为它也应该适合您的情况。

于 2012-03-28T20:55:24.220 回答