我正在将我的应用程序转移到另一台服务器,但是我遇到了一些似乎没有过期的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位
答案 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,也请检查修改日期。