CodeIgniter的ci_sessions是否需要偶尔清空?

时间:2013-03-12 12:09:49

标签: php codeigniter session

我正在使用与数据库相关的CI会话。所以我们所有的会话都在我们数据库的ci_sessions表中,并且考虑到session_id每5分钟不断变化,它可以获得很多行。

我们是否需要清空桌子,也许每个月/每周说一次?

6 个答案:

答案 0 :(得分:11)

虽然@ Marc-Audet说的是真的,但是如果你看一下代码,你就会发现它是一种非常糟糕的清理会话的方法。

构造函数每次启动时都会调用_sess_gc函数。因此,基本上每个请求都会自动加载到您的服务器。

然后,它生成一个低于100的随机数,并查看它是否低于某个值(默认为5)。如果满足此条件,则会删除会话表中的任何行,last_activity值小于当前时间减去会话到期时间。

虽然这适用于大多数情况,但技术上可能(如果世界真的是随机的)随机数生成器长时间不生成低于5的数字,在这种情况下,您的会话将不会被清理

此外,如果您将会话到期时间设置为较长时间(如果您设置为0,CI将其设置为2年),那么这些行无论如何都不会被删除。如果您的网站足够好以获得相当数量的访问者,您的DBA将很快指责会话表:)

它适用于大多数情况 - 但我不会称之为正确的解决方案。它们的会话id重新生成应该是为了删除与前面的id有关的记录,垃圾收集实际上不应该留给一个随机数 - 理论上,所需的数字可能不会像你希望的那样频繁生成

在我们的例子中,我已经从会话库中删除了会话垃圾收集,并且我每天手动处理一次(使用cron作业..以及合理的会话到期时间)。这减少了不必要的数据库命中数量,也没有在数据库中留下大量表。它仍然是一张大桌子,但比以前要小很多。

答案 1 :(得分:4)

不,CodeIgniter自行清理......

注意
根据{{​​3}}:

Session类具有内置的垃圾收集功能,可以清除过期的会话,因此您无需编写自己的例程来执行此操作。

CodeIgniter的会话类可能会检查会话表并清除过期的条目。但是,文档没有说清理何时发生。由于作为CodeIgniter的一部分没有cron作业,因此必须在调用Session类时进行清理。我想如果网站永远空闲,会话表永远不会被清除。但是,这将是一个不寻常的案例。

答案 2 :(得分:4)

鉴于OP问题没有CodeIgniter 2标记,我将回答当数据库为CodeIgniter 3增长时如何处理会话清理。

<强>问题:
当您设置(在config.php文件中)sess_time_to_update键太高(让我们说1年)和sess_regenerate_destroy键低(让我们说5分钟)时,会话当用户浏览您的网站时,表将继续增长,直到会话行将过期并将被垃圾收集(这是1年)。

<强>解决方案:
TRUE密钥设置为FALSE(默认设置为print not any("-" in elem for elem in my_list) )将删除旧会话,当它将使用新ID重新生成时,从而自动清理表。

答案 3 :(得分:2)

CodeIgniter实现SessionHandlerInterface(请参阅custom driver的文档)。

CodeIgniter为每个驱动程序(数据库,文件,redis等)定义名为 gc()的垃圾收集器方法,或者您可以为自定义驱动程序定义自定义gc()。

gc()方法通过session_set_save_handler()函数传递给PHP,因此垃圾收集器由PHP内部调用基于{{3} },session.gc_divisor设置。

例如,使用以下设置:

session.gc_probability = 1
session.gc_divisor = 100

每次请求垃圾收集器进程启动的可能性为1%。

因此,如果您的设置设置正确,则无需清理会话表。

答案 4 :(得分:1)

致电时:

$this->session->sess_destroy();

它会自行删除数据库中的信息。

答案 5 :(得分:-2)

清理桌子总是好习惯。否则,如果您查询会话数据以表示创建报告或其他内容,则会缓慢且不可靠。不过,鉴于mysql的性能,是的。