PHP:会话永远不会过期
昨晚我登录了,第二天早上我仍然登录,即使我退出了浏览器。我希望会话在几个小时后过期,我认为将“session.gc_maxlifest”设置为“1440”并将“session.cache_expire”设置为“180”时它会工作 下面是我可以从PHP.ini中找到的内容PHP:会话永远不会过期,php,apache,session,ubuntu,session-timeout,Php,Apache,Session,Ubuntu,Session Timeout,昨晚我登录了,第二天早上我仍然登录,即使我退出了浏览器。我希望会话在几个小时后过期,我认为将“session.gc_maxlifest”设置为“1440”并将“session.cache_expire”设置为“180”时它会工作 下面是我可以从PHP.ini中找到的内容 Session Support enabled Registered save handlers files user Registered serializer handlers
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
在我们的旧服务器上,我们使用了相同的设置,会话也正常工作。
与旧服务器的唯一区别是“session.save_handler”,它在旧服务器上设置为“memcache”。另外,“session.save_path”也不一样。如果您重置了gc_maxlife,那么在发生这种情况时,我可以考虑检查以下几点:
- PHP需要重新启动
- 会话在某处重新创建/重新生成
- 我不喜欢依赖其他东西并希望它们发挥作用我认为最好的解决方案是自己实现会话超时。使用简单的时间戳表示最后一个活动(即请求)的时间,并随每个请求更新:
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将
gc\u概率
更改为0以外的值可能会有所帮助
从gc\u除数的手册中:
session.gc_除数加上session.gc_概率定义了每次会话初始化时启动gc(垃圾收集)进程的概率。概率是通过使用gc_概率/gc_除数计算的,例如,1/100表示gc进程在每个请求上启动的概率为1%。session.gc_除数默认为100
如果我是从右边读的,当gc_概率为0时,垃圾收集器永远不会运行,使得gc_maxlife无用
GC对于基于文件的会话来说是一个昂贵的过程,所以在每个请求上运行它不是一个好主意,[编辑:所以PHP有一个内置的随机化来定期运行它]
增编:
对于任何具有真正安全含义的内容,正如Max的回答所建议的那样,最好在脚本中处理使会话无效的问题。另外,session.cache\u expire
设置发送到浏览器的会话页面的默认过期时间,并且根本不影响会话存储。我个人将请求之间的时间间隔存储在会话中。如果间隔>=30分钟,我就销毁并重新创建会话。