Php CodeIgniter';s ci_会话需要偶尔清空吗?

Php CodeIgniter';s ci_会话需要偶尔清空吗?,php,codeigniter,session,Php,Codeigniter,Session,我正在使用CI的会话与数据库连接。因此,我们所有的会话都在数据库的这个ci_sessions表中,考虑到会话id每5分钟不断变化,它可以得到很多行 我们是否需要清空桌子,比如说每个月/周一次?不,CodeIgniter会在自己清理完后 注意 根据报告: Session类具有内置的垃圾收集功能,可以清除过期的会话,因此您无需编写自己的例程来执行此操作 CodeIgniter的会话类可能会检查会话表并清除过期的条目。但是,文档没有说明何时进行清理。由于CodeIgniter中没有cron作业,因此必

我正在使用CI的会话与数据库连接。因此,我们所有的会话都在数据库的这个ci_sessions表中,考虑到会话id每5分钟不断变化,它可以得到很多行


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

不,CodeIgniter会在自己清理完后

注意
根据报告:

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


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

清理表格始终是一个良好的做法。否则,如果您查询会话数据以创建报告或其他内容,那么它将非常缓慢且不可靠。然而,考虑到mysql的性能,可以这样做。

当您调用:

$this->session->sess_destroy()


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

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

构造函数在每次启动时调用
\u sess\u gc
函数。因此,基本上每个请求都会自动加载到服务器上

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

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

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

它适用于大多数情况,但我不认为它是一个合适的解决方案。他们的会话id重新生成实际上应该是为了删除与以前的id相关的记录而构建的,垃圾收集实际上不应该是一个随机数——理论上,可能不会像您希望的那样频繁地生成所需的数字


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

CodeIgniter实现了(请参阅文档了解详细信息)

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

gc()方法与函数一起传递给PHP,因此垃圾收集器由PHP根据、设置在内部调用

例如,使用以下设置:

session.gc_probability = 1
session.gc_divisor = 100
垃圾收集器进程在每次请求时启动的概率为1%


因此,如果设置正确,则不需要清理会话表。

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

问题:
当您(在config.php文件中)设置
sess\u expiration
键太高(比如说1年)和
sess\u time\u to\u update
键太低(比如说5分钟)时,会话表将随着用户浏览您的网站而不断增长,直到会话行过期并被垃圾收集(即1年)

解决方案:

sess\u regenerate\u destroy
键设置为
TRUE
(默认设置为
FALSE
)将删除一个旧会话,它将使用新id重新生成自己,从而自动清理您的表。

好吧,我从不在我的站点上使用sess\u destroy。。因此,我必须手动删除它,然后?
sess\u destroy
只删除与用户当前会话id相关的记录。其余的记录只能由
\u sess\u gc
清理,请参见上面添加的注释。如果您有一个很长的截止日期,那么表make需要很长时间才能清除。您能告诉我是否使用了哪个系统文件来删除ci_会话表中的行吗?@NikoliusLau有关详细信息,请参阅我的答案:您富有洞察力的评论很有指导意义,非常有用,谢谢。cron作业技术非常有用。我使用了类似的方法来清理作为报告系统一部分生成的临时PDF文件目录。非常感谢有关CI会话的重要信息,非常感谢@dakdad:)这是CodeIgniter 3的正确答案。谢谢