问题 如何清除过期的codeigniter会话?


专家介绍,

我正在尝试了解如何在应用程序配置为在数据库表中存储会话时如何在Codeigniter中清理会话。

在我的情况下,我在该会话表中有三个过期的会话,并且对于同一个用户有一个活动的会话。手册说明: “注意:Session类具有内置的垃圾收集功能,可以清除过期的会话,因此您无需编写自己的例程来执行此操作。”

嗯,那么db会话表中的'旧'会话什么时候被清除或者我错过了什么?

谢谢!


10120
2017-11-20 00:29


起源

在2.1.3之前(user_data)未清除,您必须手动清除它,所以您的会话是否包含任何user_data?如果是这样的话,请使用$ this-> session-> unset_userdata(array(...));否则$ this-> session-> sess_destroy()就足够了 - Philip
感谢Philip,但我想了解Codeigniter如何自动清理会话以及到期后... - dutchman711


答案:


这是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%的时间(随机)垃圾收集将运行,清除会话数据库表中的旧条目。

请注意,这些旧条目没有任何意义或危害,只进行清理,因此您的数据库表不会因旧的无用记录而过载。


14
2017-11-20 01:00



非常感谢您的见解! :) - dutchman711