3

我正在将我的应用程序转移到另一台服务器,但我的 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 位

4

2 回答 2

2

请参阅此答案:如何在 30 分钟后使 PHP 会话过期?

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

于 2014-04-06T17:59:24.750 回答
0

看来配置没问题。检查存储会话文件的目录的权限。也许某些权限限制不允许 PHP 删除它们——在这种情况下,会话不会被垃圾收集。如果文件真的比 maxlifetime 更旧,还要检查修改日期。

于 2013-10-17T08:26:00.910 回答