【问题标题】:Keep PHP session alive until an hour of "inactivity" has passed保持 PHP 会话处于活动状态,直到一个小时的“不活动”过去
【发布时间】:2017-06-27 08:23:34
【问题描述】:

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

我试图确保的行为是:

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

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

我目前使用的是:

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

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

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

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

非常感谢。

【问题讨论】:

标签: php session cookies


【解决方案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
}

【讨论】:

    【解决方案2】:

    我......仍然不完全理解客户端会话 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 小时的会话。

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2021-11-24
      • 2019-11-07
      • 2019-02-25
      相关资源
      最近更新 更多