【问题标题】:PHP: Sessions never expirePHP:会话永不过期
【发布时间】:2013-09-19 13:21:47
【问题描述】:

昨晚我登录了,第二天早上我仍然登录,即使我退出了浏览器。我希望会话在几个小时后过期,并且我认为它将“session.gc_maxlifetime”设置为“1440”和“session.cache_expire”设置为“180”

这是我可以从 PHP.ini 中找到的内容

Session Support                 enabled
Registered save handlers        files user
Registered serializer handlers  php php_binary wddx


session.auto_start        Off
session.bug_compat_42     Off
session.bug_compat_warn   Off
session.cache_expire      180
session.cache_limiter     nocache
session.cookie_domain     no value
session.cookie_httponly   Off
session.cookie_lifetime   0
session.cookie_path       /
session.cookie_secure     Off
session.entropy_file      no value
session.entropy_length    0
session.gc_divisor        1000
session.gc_maxlifetime    1440
session.gc_probability    0
session.hash_bits_per_character  5
session.hash_function     0
session.name              PHPSESSID
session.referer_check     no value
session.save_handler      files
session.save_path         /var/lib/php5
session.serialize_handler php
session.use_cookies       On
session.use_only_cookies  On
session.use_trans_sid     0

在我们的旧服务器上,我们使用了相同的设置并且会话正常工作。 与旧服务器的唯一区别是在旧服务器上设置为“memcache”的“session.save_handler”。 “session.save_path”也不同。

【问题讨论】:

  • 我个人存储会话中请求之间的时间间隔。如果间隔 >= 30 分钟,我只需销毁并重新创建会话。

标签: php apache session ubuntu session-timeout


【解决方案1】:

鉴于您已重置 gc_maxlifetime,我能想到的几件事还有待检查何时发生:

  • PHP 需要重启
  • 会话在某处重新创建/重新生成

【讨论】:

    【解决方案2】:

    依赖其他东西并希望它们起作用不是我的事。 :D 我认为最好的解决方案是自己实现会话超时。使用一个简单的时间戳来表示最后一个活动(即请求)的时间,并随每个请求更新它:

    if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
        // last request was more than 30 minutes ago
        session_unset();     // unset $_SESSION variable for the run-time 
        session_destroy();   // destroy session data in storage
    }
    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
    

    使用每个请求更新会话数据也会更改会话文件的修改日期,因此垃圾收集器不会过早删除会话。

    ~Foorack

    【讨论】:

      【解决方案3】:

      gc_probablity 更改为 0 以外的值可能会有所帮助。

      来自gc_divisor的手册:

      session.gc_divisor 加上 session.gc_probability 定义了 gc(垃圾收集)进程在每次会话初始化时启动的概率。概率是通过使用 gc_probability/gc_divisor 计算的,例如1/100 表示 GC 进程有 1% 的机会在每个请求上启动。 session.gc_divisor 默认为 100。

      如果我从右边读取,gc_probability 为 0,垃圾收集器永远不会运行,从而导致 gc_maxlifetime 无用。

      GC 对于基于文件的会话来说是一个昂贵的过程,因此在每个请求上运行它并不是一个好主意,[编辑:因此 PHP 有一个内置的随机化来定期运行它]

      附录: 正如 Max 的回答所建议的那样,对于任何具有真正安全隐患的事情,最好在脚本中处理使会话无效。此外session.cache_expire 设置发送到浏览器的会话页面的默认过期时间,并且完全不影响会话存储。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2013-10-26
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多