PHP:会话永不过期

时间:2013-09-15 08:08:27

标签: php apache session ubuntu session-timeout

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

3 个答案:

答案 0 :(得分:9)

依靠其他事情并希望他们工作不是我的事。 :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

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

答案 2 :(得分:-1)

鉴于你已经重置gc_maxlifetime,我可以想到一些事情可以检查这种情况:

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