2

我是一名 PHP 新手,正在尝试了解会话的工作方式。我有一个关于 php 中会话行为的一般性问题。

所以我知道每次 session_start() 被调用时,垃圾收集器可能会以一定的概率被调用。所以我的第一个问题是,假设我的网站只有 100 个用户,并且 Web 服务器上的 session.save_path() 文件夹中存储了 2000 个会话。如果作为 100 个用户之一的用户 A 登录网站并调用 session_start(),那么用户 A 之前的会话之一被破坏还是属于所有用户的 2000 个会话之一被破坏?

我的第二个问题是,假设用户 A 在网站上停留了大约 30 分钟,并且“session.gc_maxlifetime”设置为 1440 秒,即 24 分钟,24 分钟后用户 A 的会话是否有可能被垃圾删除即使用户在网站上仍然活跃,收集器?

如果是这样,则每 24 分钟启动一个具有与先前删除的会话的所有相同信息的新会话,因为这必须是防止用户数据丢失的情况。

如果这些问题听起来非常初级,我深表歉意,但我对会话概念感到非常困惑,并希望澄清这个概念。

任何帮助将非常感激。

4

2 回答 2

2

PHP 的会话垃圾收集器以 session.gc_probability 除以 session.gc_divisor 定义的概率运行。默认情况下,这是 1/100,这意味着以 100 分之一的概率检查上述超时值。

这意味着每当启动一个新会话时,就有可能触发垃圾收集器。比 maxlifetime 更早的所有会话都将被删除

如果有人在该站点上处于活动状态,则此会话将永远不会被删除。在每次页面刷新时,实际会话将重置此会话的生命周期。只有未使用的会话将被删除。因此,如果用户只是在页面上闲置并且什么都不做,则可以删除此会话。他必须开始一个新的会话。

我希望这可以帮助您理解会话

于 2012-11-14T03:42:36.090 回答
0

垃圾收集适用于所有会话,因为 PHP 不知道会话“所有权”;之前修改的所有会话对象都time() - ini_get('session.gc_maxlifetime')将被删除。

每当使用session_start(), 在请求结束时(隐式)或session_write_close()调用时(显式)访问特定会话对象时,它的修改时间(应该)得到更新。这意味着只要用户不断地偶尔加载页面,会话就不会被破坏。

顺便说一句,我谈论的是会话对象而不是文件,因为会话的物理存储可以使用session_set_save_handler().

于 2012-11-14T03:55:48.513 回答