11

专家们,

我试图了解如何在 Codeigniter 中清理会话,以防应用程序配置为将会话存储在数据库表中。

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

嗯,那么我在数据库会话表中的“旧”会话何时被清除或者我错过了什么?

谢谢!

4

1 回答 1

15

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

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

于 2012-11-20T01:00:40.077 回答