【问题标题】:session.gc_maxlifetime not working for mesession.gc_maxlifetime 不适合我
【发布时间】:2011-01-05 01:51:57
【问题描述】:

我想将会话超时限制设置为 3 分钟,

我在页面中使用过这个

ini_set("session.gc_maxlifetime", "50"); 不工作

解决方案

如果 (isset($_SESSION['LAST_ACTIVITY']) && (时间() - $_SESSION['LAST_ACTIVITY'] > 1800)) { // 最后一个请求是 30 多分钟前 session_destroy(); // 销毁存储中的会话数据 session_unset(); // 为运行时取消设置 $_SESSION 变量 } $_SESSION['LAST_ACTIVITY'] = time(); // 更新上次活动时间戳

【问题讨论】:

  • 定义不工作:意味着我没有得到积极的解决方案,在我使用这个 gc_maxlifetime 函数之后,
  • Pekka 的真正意思是:你得到什么结果?你是如何尝试的?您收到任何错误消息吗?

标签: php


【解决方案1】:

只要文件留在服务器的文件系统上,会话就会一直存在。它们由垃圾收集器清除。垃圾收集器大约每在服务器上加载一百个页面就会运行一次(这是相当随机的,“每百个”页面加载只是一个平均值)。

此外,会话的年龄是 inactive 年龄,而不是总年龄。每次用户发出请求时,都会为该会话重置计时器。

【讨论】:

    【解决方案2】:

    三个变量用于定义PHP会话变量的垃圾回收行为:

    1. session.gc_maxlifetime 是会话的生命周期,以秒为单位 文件(默认值:1440 = 24 分钟)
    2. session.gc_probability 是 执行垃圾收集器的概率的提名者 (默认 = 1)
    3. session.gc_divisor 是分母 执行垃圾收集器的概率(默认 = 100 或 1000)

    提名者和分母一起使用来确定概率(提名者/分母)。因此,当 session.gc_probability 为 1 且 session.gc_divisor 为 100 时,这是 1 / 100 = 1 %。因此,每次页面访问(= 每次 session_start 调用)的 1% 都会执行垃圾收集器。

    如果你想测试你的会话如何过期,你需要将 session.gc_probability 和 session.gc_divisor 设置为 1,这样每次页面访问都会导致垃圾收集器运行。此外,您需要使用两种不同的浏览器进行测试。 当您使用第二个浏览器访问您的页面时,第一个浏览器的会话会被清除(并且第一个浏览器的会话已超时)。在我的测试中,当你只使用一个浏览器时,会话会自动扩展,尽管它已经过时了。

    【讨论】:

    • 将 session.gc_probability 和 session.gc_divisor 更改为 1 但没有运气。我在这里运行了这个 stackoverflow 问题中提到的脚本stackoverflow.com/questions/3428153/…
    • @VineetSajwan:该问题中的脚本是错误的。此处的 INI 设置仅在 session_start 期间评估。在另一个问题的脚本中,会话在等待时间之前开始。此外,无论此处的 INI 设置如何,打开/关闭 $_SESSION 变量的内容对于运行脚本仍然有效。
    【解决方案3】:

    session.gc_maxlifetime 值的单位是秒。所以你需要将它设置为180秒来表示3分钟。

    但除此之外,session.gc_maxlifetime 并不可靠(请参阅this post 以获得解释)。你最好自己实现,让你的会话在 3 分钟后过期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 2011-12-23
      • 2012-04-01
      • 2011-05-02
      • 2012-12-07
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多