Nik*_*Lau 5 php session codeigniter
我正在使用CI与数据库相关的会话.所以我们所有的会话都在我们数据库的ci_sessions表中,并且考虑到session_id每5分钟不断变化,它可以获得很多行.
我们是否需要清空餐桌,可能每个月/每周说一次?
dak*_*dad 12
虽然@ Marc-Audet所说的是真的,但如果你看一下代码,你会发现这是一个非常糟糕的清理会话的方法.
构造_sess_gc函数每次启动时都会调用该函数.因此,基本上每个请求都会自动加载到您的服务器.
然后,它生成一个低于100的随机数,并查看是否低于某个值(默认情况下为5).如果满足此条件,则它将删除会话表中的任何行,其last_activity值小于当前时间减去会话到期时间.
虽然这适用于大多数情况,但技术上可能(如果世界真的是随机的)随机数生成器长时间不生成低于5的数字,在这种情况下,您的会话将不会被清理.
此外,如果您将会话到期时间设置为较长时间(如果您设置为0,CI将其设置为2年),那么这些行无论如何都不会被删除.如果您的网站足够好以获得相当数量的访问者,您的DBA将很快指责会话表:)
它适用于大多数情况 - 但我不认为它是一个适当的解决方案.它们的会话id重新生成应该是为了删除与前面的id有关的记录,垃圾收集实际上不应该留给一个随机数 - 理论上,所需的数字可能不会像你希望的那样频繁生成.
在我们的例子中,我已经从会话库中删除了会话垃圾收集,并且我每天手动处理一次(使用cron作业..以及合理的会话到期时间).这减少了不必要的数据库命中数量,也没有在数据库中留下大量表.它仍然是一张大桌子,但比以前要小很多.
不,CodeIgniter 会自行清理...
注意
根据CodeIgniter 文档:
Session 类具有内置的垃圾收集功能,可以清除过期的会话,因此您无需编写自己的例程来执行此操作。
CodeIgniter 的会话类可能会检查会话表并清除过期的条目。但是,文档没有说明何时进行清理。由于 CodeIgniter 中没有 cron 作业,因此必须在调用 Session 类时进行清理。我想如果站点永远保持空闲状态,会话表将永远不会被清除。但是,这将是一个不寻常的情况。
鉴于 OP 问题没有 CodeIgniter 2 标签,我将回答如何在 CodeIgniter 3 的数据库不断增长时处理会话清理。
问题:
当您设置(在 config.php 文件中)sess_expiration键太高(假设为 1 年)和sess_time_to_update键太低(假设为 5 分钟)时,会话表将随着用户浏览您的网站而不断增长,直到会话行过期并将被垃圾收集(即 1 年)。
解决方案:
将sess_regenerate_destroykey设置为TRUE(默认设置为FALSE)将删除旧会话,当它使用新 ID 重新生成自己时,从而自动清理您的表。
| 归档时间: |
|
| 查看次数: |
7240 次 |
| 最近记录: |