Zend Session和Namespace Expiries

时间:2013-07-22 12:46:56

标签: php zend-framework zend-session

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

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

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

  

值得注意的是,预订区的行为与Ticketmaster非常相似,将保留准确性保持在第二位是至关重要的。

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

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

我的这个实现的问题是,由于时间差异,我不知道如何管理管理区域的会话。

2 个答案:

答案 0 :(得分: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);
}

如果您已实施预订令牌解决方案,则延长会话时间不会再导致您的预订出现问题。

答案 1 :(得分:0)

您可以在Zend_Session_Namespace中使用setExpirationSeconds方法。

$session->setExpirationSeconds(10);

在10秒内到期。