进行此会话设置:
@ini_set('session.gc_probability', 1);
@ini_set('session.gc_divisor', 1);
@ini_set('session.gc_maxlifetime', 60);
session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc');
function _sess_gc($maxlifetime) {
echo "GC started";
}
据我所知,这个设置垃圾收集器应该每60秒运行一次(因为概率和除数是相同的)。我现在正在测试这个,奇怪的是GC每次刷新网站时都会运行,它不会等到上一次调用过去60秒。这对我来说有点混乱,我在这里理解错了吗?
答案 0 :(得分:1)
session.gc_probability / session.gc_divisor = x
在你的情况下x = 1.(= 100%几率)
这意味着垃圾收集器将在每个请求上运行。这是任何人提出的每一个要求。
垃圾收集器只会删除陈旧且有资格删除的会话文件,而不是最近修改过的文件。 被认为陈旧的内容由session.gc_maxlifetime
定义答案 1 :(得分:1)
GC并不总是在每个请求上运行,默认的PHP设置是1%的机会运行GC。 session.gc_probability
(默认为1)/ session.gc_divisor
(默认为100)= 0.01(机率为1%)
相关手册输入:http://php.net/manual/en/session.configuration.php#ini.session.gc-probability
我的建议是存储上次触摸会话的时间,并在每次加载页面时检查该值,如果已经过了足够的时间,session_destroy
并将用户重定向到登录页面。
我认为您还应该尝试在启动会话后在_sess_open中添加此内容。 session_start()
行添加后
session_write_close(); // dump $_SESSION out to file, close file, release lock.
看看其中任何一项是否也能解决您的问题。