PHP会话不会过期。自从

时间:2013-10-17 08:16:11

标签: php session cookies

我正在将我的应用程序转移到另一台服务器,但是我遇到了一些似乎没有过期的PHP会话问题。

在php.ini中我设置了:

session.gc_probability = 1
session.gc_divisor = 1
session.gc_maxlifetime = 300

当然,Cookie已启用。仍然,在5分钟后,如果我刷新页面,我仍然登录。即使我关闭浏览器并重新打开页面。 修改:实际上,似乎关闭浏览器清除会话。

由于每个请求首先通过某个脚本(RewriteRule / begin.php),我很幸运,我可以解决这个问题:

session_start();
if (time() > @$_SESSION['sessionLimit']) {
    session_destroy();
    session_start();
}
$_SESSION['sessionLimit'] = time() + ini_get('session.gc_maxlifetime');

但是,我仍然不知道我做错了什么以及为什么在旧服务器中一切都很好(即使session.gc_divisor设置为10)。

旧服务器:Windows Server 2003,Apache 2.4,PHP 5.4.5,全部32位

新服务器:Windows Server 2008 R2,Apache 2.4,PHP 5.5.4,全部64位

2 个答案:

答案 0 :(得分:2)

请参阅此答案:How do I expire a PHP session after 30 minutes?

Gumbo比以往任何时候都更好地解释了这件事。

特别是,Gumbo解释了为什么session.gc_maxlifetime不可靠,他建议自己实现会话超时,使用表示最后一次活动(即请求)的时间的简单时间戳,并更新每个请求的时间戳:
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) { // last request was more than 30 minutes ago session_unset(); // unset $_SESSION variable for the run-time session_destroy(); // destroy session data in storage } $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

答案 1 :(得分:0)

似乎配置很好。检查存储会话文件的目录的权限。也许某些权限限制不允许PHP删除它们 - 在这种情况下,会话不会被垃圾收集。如果文件确实早于maxlifetime,也请检查修改日期。