用户仍在网站上时 PHP 会话到期

Posted

技术标签:

【中文标题】用户仍在网站上时 PHP 会话到期【英文标题】:PHP session expiration while the user is still on the website 【发布时间】:2012-11-02 13:08:25 【问题描述】:

我是一名 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 分钟就会启动一个具有与先前删除的会话的所有相同信息的新会话,因为这必须是防止用户数据丢失的情况。

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

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

我希望这能帮助你理解会话

【讨论】:

关于原始发布者关于“用户 A”与所有用户的会话的问题 - 当垃圾收集运行时,这会影响所有会话。 PHP 无法区分用户的新会话与新的任意用户。 我对本杰明的问题有一个后续问题。我想知道会话生命周期是否在每次页面刷新时重置,或者是否在每次页面刷新后启动一个全新的会话?因为当页面刷新时,代码会重新运行,并且 session_start() 也会运行。 session_start() 创建会话或恢复当前会话。如果会话成功启动,此函数返回 TRUE,否则返回 FALSE。所以如果一个会话已经开始,它不会开始一个新的

以上是关于用户仍在网站上时 PHP 会话到期的主要内容,如果未能解决你的问题,请参考以下文章

范围 codeigniter 会话到期

PHP 会话在 40 分钟后到期

PHP 会话过期 - 它啥时候刷新?

清除cookie并强制每次用户访问网站时登录?

带有 Codeigniter 会话到期时间的帮助

如何在 mvc 5 中知道 OWIN cookie/用户会话即将到期