首页 >后端开发 >php教程 >如何可靠地管理 PHP 会话 30 分钟后过期?

如何可靠地管理 PHP 会话 30 分钟后过期?

Barbara Streisand
Barbara Streisand原创
2024-12-25 04:59:16797浏览

How to Reliably Manage PHP Session Expiry After 30 Minutes?

如何管理 PHP 会话在 30 分钟后过期

需要将会话保持在特定时间,然后终止它在网络开发中很常见。 PHP 提供了设置会话超时的选项,但它们可能并不总是产生可靠的结果。让我们了解现有 PHP 机制的缺点,并探索可靠的解决方案。

PHP 内置超时选项的可靠性问题

PHP 提供了两种设置会话的选项timeouts:

  1. session.gc_maxlifetime:控制 PHP 将会话数据视为“垃圾”并启动清理的秒数。但是,此选项并不可靠,因为垃圾收集过程取决于 session.gc_probability 和 session.gc_divisor 确定的随机概率。
  2. session.cookie_lifetime:指定发送的 cookie 的生命周期到浏览器。但是,此选项只会影响 cookie 的持续时间,不会使会话本身失效。

实现自定义会话超时机制

建立可靠的会话超时机制会话超时,实施您自己的解决方案。这可以通过维护代表上次用户活动的时间戳来实现。

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // Last request was more than 30 minutes ago
    session_unset(); // Unset $_SESSION variable
    session_destroy(); // Destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // Update last activity timestamp
  1. 检查会话中是否存在“LAST_ACTIVITY”键,并验证自上次活动以来是否已经过去了 30 分钟。
  2. 如果会话处于非活动状态超过 30 分钟,请使用 session_unset() 取消设置所有会话变量并使用销毁会话session_destroy()。
  3. 定期更新每个请求的“LAST_ACTIVITY”时间戳,以在活动使用期间保持会话处于活动状态。

因为每次请求更新会话数据都会修改会话文件的修改日期,垃圾收集器不会过早删除会话。

为了增加安全性,请考虑定期重新生成会话 ID 以缓解会话劫持尝试:

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // Session started more than 30 minutes ago
    session_regenerate_id(true); // Change session ID and invalidate old one
    $_SESSION['CREATED'] = time(); // Update creation time
}

附加说明

  1. 确保将 session.gc_maxlifetime 设置为大于或等于自定义过期时间的值处理程序持续时间(本例中为 1800)。
  2. 如果您希望使会话过期基于 30 分钟的活动,使用 setcookie(..., time() 60*30) 设置 cookie 过期时间,以保持会话 cookie 处于活动状态。

以上是如何可靠地管理 PHP 会话 30 分钟后过期?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn