php中的会话超时问题

时间:2013-03-04 09:01:08

标签: php session-state

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

可能是什么问题?

1 个答案:

答案 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分钟超时之前重新打开浏览器时会感到惊讶。

关于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文件将被废弃,不再被访问;因此,如上所述随时收集垃圾。

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