1

我有 2 个需要会话管理的区域,有 2 个不同的到期时间:

  • 行政区 - 20 分钟
  • 预订区 - 3 分钟

使用Zend_Session,如何为同一用户管理两者?

需要注意的是,Reservation Area 的行为与 Ticketmaster 非常相似,其中将预订准确度保持在秒是至关重要的。

我当前的实现使用了Zend_Session_SaveHandler_DbTable,如果可能的话,我想坚持下去。

我将Session_ID主 Session 表中的 Session 表存储在 Reservation 表中以指示预订。这很有效,因为它允许我使用垃圾收集来清理废弃的会话(我有一个每分钟触发垃圾收集的 cron)。

我对这个实现的问题是,考虑到时差,我不知道如何管理行政区的会话。

4

2 回答 2

1

我认为您需要一个应用程序级别的东西来管理这些保留,而不是依赖会话本身。会话到期时很难“做事”,我认为会话并不是真正设计为依赖于这种功能。

我建议您创建一个单独的表来保存预订令牌。这些将有一个唯一的“令牌”哈希作为主键、一个“到期”日期,可能还有一个可选的用户 ID。不是将 Session_ID 存储在预留表上,而是存储令牌,并使用相同的约束(因此删除令牌会释放预留)。您添加了一个使令牌过期的额外 cron 作业——这可以像执行DELETE FROM reservation_tokens WHERE expires < NOW()查询一样简单。在会话中存储令牌,检查令牌的过期时间将告诉您预订是否仍然有效。

这样,您的预订到期不再依赖于会话到期。如果他们再次登录(在预订过期之前),它还允许登录用户仍然拥有相同的预订。

至于管理登录,我过去采用的一种方法是在用户进行身份验证时简单地延长会话到期时间。这很容易做到,只需在有效登录后:

// assuming $result is a Zend_Auth_Result
if ($result->isValid()) {
    // extend the user's session
    $lifetime = 1200;
    ini_set('session.cookie_lifetime', $lifetime);
    Zend_Session::rememberMe($lifetime);
}

如果您已经实施了预订令牌解决方案,那么拥有更长的会话就不会再导致您的预订出现问题。

于 2013-07-22T14:54:03.547 回答
0

您可以使用setExpirationSecondsZend_Session_Namespace 中的方法。

$session->setExpirationSeconds(10);

10 秒后到期。

于 2013-07-22T12:55:11.510 回答