它是如何工作的gc_maxlifetime

时间:2015-07-07 14:03:07

标签: php

进行此会话设置:

@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秒。这对我来说有点混乱,我在这里理解错了吗?

2 个答案:

答案 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.

看看其中任何一项是否也能解决您的问题。