专家,
我正在尝试了解如何在应用程序配置为在数据库表中存储会话时如何在Codeigniter中清理会话。
在我的情况下,我在该会话表中有三个过期的会话,对同一个用户有一个活动的会话。手册说明: “注意:Session类具有内置的垃圾收集功能,可以清除过期的会话,因此您无需编写自己的例程来执行此操作。”
嗯,那么db会话表中我的'旧'会话何时被清除或者我错过了什么?
谢谢!
答案 0 :(得分:14)
以下是Session类的相关源代码:
/**
* Garbage collection
*
* This deletes expired session rows from database
* if the probability percentage is met
*
* @access public
* @return void
*/
function _sess_gc()
{
if ($this->sess_use_database != TRUE)
{
return;
}
srand(time());
if ((rand() % 100) < $this->gc_probability)
{
$expire = $this->now - $this->sess_expiration;
$this->CI->db->where("last_activity < {$expire}");
$this->CI->db->delete($this->sess_table_name);
log_message('debug', 'Session garbage collection performed.');
}
}
这个函数在一个地方被调用,在Session类的构造函数中(几乎是最后一行),所以在正常情况下每个请求一次。
$this->gc_probability
被硬编码到班级顶部的5
,似乎无法更改它。我不确定,但我相信这意味着5%的时间(随机)垃圾收集将运行,清除会话数据库表中的旧条目。
请注意,这些旧条目没有任何意义或危害,只进行清理,因此您的数据库表不会因旧的无用记录而过载。