4

我已将会话超时时间设置为 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);

可能是什么问题?

4

1 回答 1

1

用户浏览其他页面时,20 分钟到期不会重置。此评论中解释了该问题:

由于 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_lifetimeto0以便 cookie 在浏览器关闭时过期。否则,假设关闭浏览器将结束会话的用户会在 20 分钟超时之前重新打开浏览器时感到惊讶。

关于 gc_xxxx 设置的编辑

gc_probability = 1,gc_divisor = 1,gc_maxlifetime = 1200

1/1意味着 PHP 将检查每次session_start调用的会话文件的日期。

gc_probability = 1,gc_divisor = 100,gc_maxlifetime = 1200

1/100表示 PHP 将随机检查会话文件的日期,但大约每 100 次session_start调用一次。

日期检查本身包括将会话文件的访问时间与 gc_maxlifetime 进行比较;如果在过去(例如)20 分钟内未访问该文件,它将删除该文件。

话虽如此,如果 cookie 由于超时(或在超时为 0 时关闭浏览器)而过期,则会话将立即过期,因为浏览器停止发送过期的会话 id cookie;在这种情况下,PHP 会发出一个新的会话 id cookie。与过期 cookie 关联的会话 id 文件被废弃,不再被访问;因此如上所述随时收集垃圾。

最后,您的具体问题可以解决 (i) 通过查看会话 id cookie (ii) 的到期日期并记住在访问/刷新页面时不会更新具有超时的 cookie。

于 2013-03-04T09:09:51.503 回答