【问题标题】:Can php's garbage collection delete the session of the initiating scriptphp的垃圾回收可以删除启动脚本的session吗
【发布时间】:2013-04-04 06:45:19
【问题描述】:

假设我的 php.ini 文件中有这些设置(当然不是“正常”设置):

session.gc_maxlifetime = 60
session.gc_probability = 1
session.gc_divisor = 1

这意味着在每次会话初始化中,垃圾收集都会运行并清理所有早于一分钟的会话。

假设只有一个用户连接到服务器并运行初始化会话的脚本。如果他/她在 70 秒(或任何超过 60 秒)后再次运行它,他/她自己的会话会被删除吗?

也就是说,垃圾回收是在脚本执行之前还是之后发生的?

【问题讨论】:

  • 不管什么时候发生,如果他们的会话没有过期,它就不会被垃圾回收。会话超时是完全不同的设置。

标签: php session


【解决方案1】:

垃圾收集应该在运行脚本之前进行。这是正确的行为。我的意思是,会话应该在gc_maxlifetime 之后的任何时候过期。 PHP 应该在运行脚本之前进行垃圾收集,以确保它正常工作。

但是我很好奇,并尝试了它,我的测试证实了我的假设。

这是一个简单的测试。使用给定的设置,我测试了存储在 session 中的变量是否在 X 秒后存在,但事实并非如此。所以垃圾回收是在运行脚本之前完成的。

注意:如果您使用 cookie,您还必须将会话 cookie 生命周期设置为过期。

【讨论】:

  • 垃圾收集不会在脚本之前运行 - 它在调用 session_start() 时运行。但是,正如您所发现的,GC 发生在会话初始化之前,因此会在会话加载之前将其删除。因此,最终结果正如您所描述的那样,即使您的解释在技术层面上并不完全正确。
【解决方案2】:

内置会话 GC 在会话初始化 (see gc_divisor) 期间启动,即通过 session_start() 函数。当session.autostart 为真时,session_start() 在第一行代码之前执行。

【讨论】:

  • 这并不能完全回答问题 - 它说 GC 发生在“会话初始化期间”,但没有说明这是在脚本尝试定位请求的会话文件之前还是之后。这是回答这个问题的关键细节。
  • 它要么在代码的第一行之前,要么在 session_start() 被调用的时间/地点。
猜你喜欢
  • 2012-06-23
  • 2011-07-15
  • 1970-01-01
  • 2011-03-07
  • 2013-08-10
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2018-07-05
相关资源
最近更新 更多