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

2admgd59  于 2022-12-16  发布在  其他
关注(0)|答案(7)|浏览(181)

我使用CI的会话连接数据库,所以我们所有的会话都在数据库的ci_sessions表中,考虑到session_id每5分钟更改一次,它可以获得很多行。
我们是否需要清空table,比如说一个月/一周一次?

sf6xfgos

sf6xfgos1#

虽然@Marc-Audet说的是真的,但如果您看一看代码,就会发现这是一种非常糟糕的清理会话的方式。
构造函数在每次初始化的时候都会调用_sess_gc函数,所以,基本上,如果你已经自动加载了它,那么每个请求都会调用它。
然后,它生成一个小于100的随机数,并查看该值是否小于某个值(默认值为5)。如果满足此条件,则它将删除会话表中last_activity值小于当前时间减去会话到期时间的值的所有行。
虽然这在大多数情况下都有效,但从技术上讲,随机数生成器可能长时间不生成小于5的数字(如果世界真的是随机的),在这种情况下,您的会话将不会被清理。
另外,如果你把会话过期时间设置为很长时间(如果你设置为0,CI会把它设置为2年),那么这些行无论如何都不会被删除。如果你的站点足够好,可以获得相当数量的访问者,你的DBA很快就会对会话表指指点点:)
它适用于大多数情况--但我不认为这是一个合适的解决方案。它们的会话ID重新生成确实应该被构建为删除与以前的ID相关的记录,垃圾收集确实不应该留给一个随机数--理论上,所需的数字可能没有像您希望的那样频繁地生成。
在我们的例子中,我已经从会话库中删除了会话垃圾收集,并且每天手动处理一次(使用cron作业..和合理的会话过期时间)。这减少了对数据库的不必要的命中次数,也不会在数据库中留下庞大的表。它仍然是一个大表,但比以前小得多。

mbjcgjjk

mbjcgjjk2#

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

发行日期:

当您(在config.php文件中)将sess_expiration键设置得太高(假设为1年)而将sess_time_to_update键设置得太低(假设为5分钟)时,会话表将随着用户浏览您的网站而不断增长,直到会话行过期并被垃圾收集(即1年)。

解决方案:

sess_regenerate_destroy键设置为TRUE(默认设置为FALSE)将删除旧会话,此时它将使用新ID重新生成自己,从而自动清理表。

lsmd5eda

lsmd5eda3#

不,CodeIgniter会自行清理...

根据CodeIgniter documentation

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

CodeIgniter的Session类可能会检查会话表并清理过期条目。但是,文档没有说明何时进行清理。因为CodeIgniter没有cron作业,所以清理必须在调用Session类时进行。我想如果站点永远处于空闲状态,会话表将永远不会被清理。但是,这将是一个不寻常的情况。

fafcakar

fafcakar4#

CodeIgniter实现了SessionHandlerInterface(请参阅文档了解定制驱动程序)。
CodeIgniter为每个驱动程序(数据库、文件、redis等)定义了一个名为**gc()**的垃圾收集器方法,或者您可以为自定义驱动程序定义自定义gc()。

gc()方法通过session_set_save_handler()函数传递给PHP,因此垃圾收集器由PHP根据session.gc_divisor、session.gc_probability设置在内部调用。

例如,使用以下设置:

session.gc_probability = 1
session.gc_divisor = 100

垃圾收集器进程有1%的机会在每个请求时启动。
因此,如果设置正确,则不需要清除会话表。

yqhsw0fo

yqhsw0fo5#

当您呼叫:
$this->session->sess_destroy();
自动删除数据库中的信息。

scyqe7ek

scyqe7ek6#

从PHP7开始,默认情况下基于GC的方法是 disabled 的,正如https://www.php.net/manual/en/function.session-gc.php上的文档所示。偶然发现这一点是因为一个遗留应用程序突然停止工作,达到了系统限制,因为会话从来没有被清理过。

lpwwtiir

lpwwtiir7#

清除表总是一个很好的习惯,否则,如果你为了创建报告或其他什么而查询会话数据,它会很慢,而且不可靠,尽管如此,考虑到mysql的性能,是的,这样做。

相关问题