4

我无法使用 codeigniter 在数据库中存储会话。

当用户登录时,会创建一个会话并将其存储在数据库中。数据被填充到数据库中。当用户使用注销按钮时,会话数据被清空,但是会话仍然存在于数据库中。

问题是当用户不使用注销按钮而只是关闭网络浏览器时。会话数据未清空,但用户仍处于注销状态。(我已经在我的配置文件中设置了这个)会话应该在数据库中被销毁,但事实并非如此!

当用户在单击“注销”按钮后重新登录时,用户第一次登录时创建的会话将再次填充数据。所以这没有问题。

但是当用户在关闭浏览器后重新登录时,它会创建一个新会话。

这个问题最终导致会话无休止,每次用户关闭浏览器时都会创建会话。

其他让我感到困惑的事情:当我使用帐户登录时,会创建一个会话。然后,当我使用该帐户注销并使用另一个帐户登录时,会话将存储在与另一个帐户相同的记录中。会话表中的新记录何时创建?

我正在使用 2.1.3 版的 codeigniter。

我究竟做错了什么?

//Session config:

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 300;
4

1 回答 1

3

您已sess_expire_on_close设置为TRUE,因此这是预期的行为,并且在大多数情况下您通常都希望这样做。问题是,当浏览器关闭并再次打开时,会生成一个新的 cookie(因此是会话)。从CI 会话类文档(转到底部讨论在数据库中保存会话):

注意: Session 类具有内置的垃圾收集功能,可以清除过期的会话,因此您无需编写自己的例程来执行此操作。

因此,您不必担心解决问题,孤立的会话将由会话类自动从数据库中收集垃圾。如果你愿意,你可以通过 cron 实现代码来清除它,但你真的不需要。

现在,如果这给特定的登录用户(例如“记住我”)带来了问题,您希望会话在关闭时对其他人来说过期,您可以通过手动设置另一个比您的会话 cookie 和相关性更长的 cookie 来解决它会话数据库中的一个项目。这使您可以确定用户“是谁”并重建会话是否应该为他们神奇地持续存在。在这个对一个有点相关的问题的回答中,还有更多关于这一点的内容。

于 2013-02-10T14:05:48.823 回答