保持 PHP 会话处于活动状态,直到一个小时的"不活动"过去



我已经阅读了几篇关于这个主题的文章,但仍然不完全理解客户端会话cookie,服务器端会话文件之间的关系,以及PHP"随机"选择在垃圾收集期间删除或保留会话的方式。

我试图确保的行为是:

  • 用户登录,会话开始
  • 如果用户处于非活动状态*1 小时,则会话 摧毁

*这对我的网站至关重要,因为用户可能在同一页面上花费了一个小时显然"空闲",但实际上他们并没有闲置。他们可能正在撰写一份很长的书面报告,观看视频等。

到目前为止,我使用的是:

session_start();
setcookie(session_name(),session_id(),time()+3600);

此代码在每次页面加载时执行。

我还通过 setInterval 每分钟触发一个 AJAX 请求,该请求在用户明显处于"空闲"状态的页面上加载包含上述代码的 PHP 脚本。

我的方法能确保我所需的行为吗?还是我错过了什么?也许有一种更清洁的方法来确保这种行为。

提前非常感谢。

你可以尝试这样的事情:

if (isset($_SESSION['LAST_ACTIVITY'])&&(time() - $_SESSION['LAST_ACTIVITY'] > 3600)) {
// this takes 60 minutes
session_unset();   
session_destroy();   // destroy session data that is in storage
}

I ...仍然不完全理解客户端会话cookie,服务器端会话文件之间的关系,以及PHP"随机"选择在垃圾回收期间删除或保留会话的方式。

客户端 Cookie 不包含有关用户的任何信息。它只是一个令牌,每个新请求都会与任何其他信息一起发送到服务器。您设置的过期限制指示客户端 Cookie 的有效期。

服务器端会话文件和垃圾回收是另一回事。在 php 中.ini您可以设置session.gc_maxlifetime,默认为 1440,表示"数据将被视为'垃圾'并可能被清理的秒数"。然后是session.gc_probability(默认为1)和session.gc_divisor(默认为100)。

这意味着,在1440秒后,垃圾收集器将启动1/100,清理会话,现在被认为是垃圾。

如果您希望在一小时后以 100% 的概率删除会话,请将session.gc_probability设置为0并手动删除旧会话。为此,您可以将"上次活动"保存在数据库中,并 cron 一个脚本,该脚本会删除具有"上次活动"且差异大于 1 小时的会话time()

最新更新