我将会话超时时间设置为20分钟,如下所示。有时会话超时发生在两三分钟内。
ini_set('session.gc_maxlifetime', 1200);
ini_set('session.cookie_lifetime', 1200);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
可能是什么问题?
答案 0 :(得分:1)
当用户浏览其他页面时,20分钟到期不会重置。问题在this comment中解释:
由于PHP的会话控制无法正确处理会话生存期 当使用session_set_cookie_params()时,我们需要做一些事情 每次用户访问我们时,都要更改会话到期时间 现场。所以,这就是问题所在。
$lifetime=600; session_set_cookie_params($lifetime); session_start();
此代码不会更改用户的会话生命周期 回到我们的网站或刷新页面。会话将过期 在$ lifetime秒之后,无论用户请求多少次 这页纸。所以我们只是按如下方式覆盖会话cookie:
$lifetime=600; session_start(); setcookie(session_name(),session_id(),time()+$lifetime);
现在我们有相同的会话cookie,其生命周期设置为 适当的价值。
最好,将session.cookie_lifetime
保留到0
,以便在浏览器关闭时Cookie过期。否则,假设关闭浏览器将结束会话的用户在20分钟超时之前重新打开浏览器时会感到惊讶。
1/1
表示PHP会检查每次session_start
次呼叫的会话文件的日期。
1/100
表示PHP将随机检查会话文件的日期,但大约每100 session_start
次调用一次。
日期检查本身包括将会话文件的访问时间与gc_maxlifetime进行比较;如果过去没有访问过(例如)20分钟,它会删除该文件。
话虽如此,如果cookie由于超时(或超时为0时关闭浏览器)而到期,则会话立即到期,因为浏览器停止发送过期的会话ID cookie;在这种情况下,PHP会发出一个新的会话ID cookie。与过期的cookie关联的会话ID文件将被废弃,不再被访问;因此,如上所述随时收集垃圾。
最后,您可以通过查看会话ID cookie(ii)的到期日期来解决您的具体问题,并记住在访问/刷新页面时不会续订超时的Cookie。