让PHP会话保持活动状态,直到经过一小时的“不活动”

时间:2017-06-27 08:23:34

标签: php session cookies

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

我想要确保的行为是:

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

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

到目前为止我使用的是:

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

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

我还有一个通过setInterval每分钟触发的AJAX请求,它会在用户显然“空闲”的页面上加载包含上述代码的PHP脚本。

我的方法会确保我需要的行为吗?或者我错过了什么?也许有一种更清洁的方法来确保这种行为。

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情:

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
}

答案 1 :(得分:1)

  

我...仍然不完全理解客户端会话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中保存一个脚本,该脚本会删除会话,这些会话的“最后活动”和time()差异大于1小时。