昨晚我登录,第二天早上我仍然登录,即使我退出了浏览器。我希望会话在几个小时后过期,我认为它可以将“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”也不同。
答案 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
的手册:
如果我正在读这个权利,当gc_probability为0时,垃圾收集器永远不会运行,导致gc_maxlifetime无用。
GC对于基于文件的会话来说是一个昂贵的过程,因此在每个请求上运行它都不是一个好主意,[编辑:所以PHP有一个内置的随机化来定期运行它]附录:
对于任何具有真正安全隐患的事情,最好处理脚本中的会话失效,正如Max的回答所暗示的那样。此外,session.cache_expire
设置发送到浏览器的会话页面的默认到期时间,并且根本不会影响会话存储。
答案 2 :(得分:-1)
鉴于你已经重置gc_maxlifetime,我可以想到一些事情可以检查这种情况: