我想了解工作阶段如何清理在笨的情况下,应用程序被配置为在数据库表中存储会话。
就我而言,我在该会话表中有三个过期的会话,同一个用户有一个活动的会话。该手册指出: “注意:Session类具有内置的垃圾回收功能,可以清除过期的会话,因此您无需编写自己的例程来执行此操作。”
嗯,那么当我的数据库会话表中的'旧'会话被清除出去,还是我错过了什么?
谢谢!
我想了解工作阶段如何清理在笨的情况下,应用程序被配置为在数据库表中存储会话。
就我而言,我在该会话表中有三个过期的会话,同一个用户有一个活动的会话。该手册指出: “注意: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.');
}
}
调用此功能在一个地方,在会话类(几乎是最后一行)的构造,所以一旦每个请求一般情况下。
$this->gc_probability
被硬编码为5
在类的顶部,它似乎不可能改变它。我不确定,但我相信这意味着垃圾收集将运行5%(随机),从会话数据库表中清除旧条目。
请注意,这些旧条目没有意义或伤害,只进行清理,以便您的数据库表不会因过时,无用的记录而过载。
非常感谢您的洞察! :) – dutchman711
在2.1.3(user_data)未被清除之前,您必须手动清除它,所以您的会话是否包含任何user_data?如果是这样,使用$ this-> session-> unset_userdata(array(...));否则$ this-> session-> sess_destroy()应该足够了 – Philip
感谢Philip,但我想知道Codeigniter如何自动清理会话以及到期后的时间...... – dutchman711