【问题标题】:PHP sessions don't expire. EverPHP 会话不会过期。曾经
【发布时间】:2013-10-17 08:16:11
【问题描述】:

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

【问题讨论】:

  • auto_prepend_file 是一种比 .htaccess 重写更好的“启动”脚本方式。
  • @NiettheDarkAbsol 不错。但我没有使用 .htaccess,它位于 Apache 的 conf 文件中。无论如何,begin.php 用于每个请求,包括图像等。
  • 你的 session.save_path 设置是什么,运行在什么样的操作系统上?
  • @CBroe 它没有任何价值,但对于旧服务器也是如此。如问题所述,操作系统是 Windows Server 2008 R2。
  • @Wrikken 我是唯一使用该服务器的人。我打开的页面不涉及 AJAX。您的测试不会改变结果。

标签: php session cookies


【解决方案1】:

请看这个答案: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

【讨论】:

  • 啊,这很有用,我不久前就得到了那个答案。最后,正如问题中所述,这正是我所做的。由于它仍然没有标记答案,我不妨标记你的指向正确的解释。
【解决方案2】:

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

【讨论】:

  • 那就是c:\windows\temp。你的意思是 PHP 可以创建会话文件,但不能删除它? session_destroy 不会也失败吗?
  • 嗯,如果是临时的,那么权限就不是这样了。我不确定 session_destroy,因为它实际上会破坏会话数据(文档说:“销毁所有注册到会话的数据”)。它不会破坏会话标识符,因此会话文件可能不会被删除,而只是清除会话数据。那么文件日期呢?
猜你喜欢
  • 2013-09-19
  • 2011-04-07
  • 2015-04-13
  • 2011-10-17
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多