我在使用codeigniter在数据库中存储会话时遇到了问题。
当用户登录时,会话创建并存储在数据库中。数据填入数据库。当用户使用注销按钮时,会话数据被清空,但是,会话仍然存在于数据库中。
问题是当用户不使用注销按钮但只关闭web浏览器时。会话数据未清空,但用户仍然已注销。 (我在我的配置文件中设置了这个)会话应该在数据库中销毁但不是!
当用户在单击“注销”按钮后重新登录时,第一次用户登录时创建的会话将再次填充数据。所以没有问题。
但是当用户在关闭浏览器后重新登录时,它会创建一个新会话。
这个问题最终导致无休止的会话,每次用户关闭浏览器时都会创建会话。
让我困惑的其他事情:当我使用帐户登录时,会创建一个会话。当我随后使用该帐户注销并使用其他帐户登录时,会话将存储在与其他帐户相同的记录中。何时创建会话表中的新记录?
我正在使用codeigniter的2.1.3版本。
我做错了什么?
//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;
答案 0 :(得分:3)
您已将sess_expire_on_close
设置为TRUE
,因此这是预期的行为,而通常在大多数情况下都需要这样做。问题是,当浏览器关闭并再次打开时,会生成一个新的cookie(因此会话)。从CI session class documentation开始(到底部讨论在数据库中保存会话):
注意:Session类具有内置的垃圾收集功能,可以清除过期的会话,因此您无需编写自己的例程来执行此操作。
因此,您不必担心寻址,孤立会话将由会话类自动从数据库中进行垃圾收集。如果需要,可以通过cron实现代码清理,但实际上并不需要。
现在,如果这对特定登录用户存在问题(例如“记住我”)但是你希望会话在其他人关闭时过期,你可以通过手动设置另一个远远超过会话cookie的cookie并在会话数据库中关联其中的项目来解决它。这可以让你弄清楚用户是谁'并重建会话,如果它应该神奇地持续存在。关于某个相关问题,in this answer还有一些问题。