4

昨晚我登录了,第二天早上我仍然登录,即使我退出了浏览器。我希望会话在几个小时后到期,我认为它可以在“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”也不同。

4

3 回答 3

9

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

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

于 2013-09-15T08:25:09.050 回答
2

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设置发送到浏览器的会话页面的默认过期时间,并且根本不影响会话存储。

于 2013-09-15T08:25:47.590 回答
-1

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

  • PHP 需要重启
  • 会话在某处重新创建/重新生成
于 2013-09-15T08:22:33.650 回答