gpt4 book ai didi

php - 如何在 30 分钟后使 PHP session 过期?

转载 作者:IT王子 更新时间:2023-10-29 00:04:16 25 4
gpt4 key购买 nike

我需要将 session 保持 30 分钟,然后将其销毁。

最佳答案

您应该实现自己的 session 超时。其他人提到的两个选项( session.gc_maxlifetimesession.cookie_lifetime )都不可靠。我会解释原因。

首先:

session.gc_maxlifetime
session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and cleaned up. Garbage collection occurs during session start.

但是垃圾收集器只以session.gc_probability的概率启动除以 session.gc_divisor .并且使用这些选项的默认值(分别为 1 和 100),机会仅为 1%。

好吧,您可以简单地调整这些值,以便更频繁地启动垃圾收集器。但是当垃圾收集器启动时,它会检查每个注册 session 的有效性。这是成本密集型的​​。

此外,当使用 PHP 的默认 session.save_handler 时文件, session 数据存储在 session.save_path 中指定路径的文件中.使用该 session 处理程序, session 数据的年龄是根据文件的最后修改日期而不是最后访问日期计算的:

Note: If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other filesystem where atime tracking is not available. Since PHP 4.2.3 it has used mtime (modified date) instead of atime. So, you won't have problems with filesystems where atime tracking is not available.

因此,还可能会发生 session 数据文件被删除而 session 本身仍被视为有效的情况,因为 session 数据最近未更新。

第二个:

session.cookie_lifetime
session.cookie_lifetime specifies the lifetime of the cookie in seconds which is sent to the browser. […]

是的,没错。这只会影响 cookie 的生命周期, session 本身可能仍然有效。但使 session 无效是服务器的任务,而不是客户端的任务。所以这没有任何帮助。事实上,将 session.cookie_lifetime 设置为 0 会使 session 的 cookie 成为真正的 session cookie。这仅在浏览器关闭之前有效。

结论/最佳解决方案:

最好的解决方案是实现您自己的 session 超时。使用一个简单的时间戳来表示最后一次事件(即请求)的时间,并在每次请求时更新它:

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

使用每个请求更新 session 数据也会更改 session 文件的修改日期,这样 session 就不会被垃圾收集器过早删除。

您还可以使用额外的时间戳定期重新生成 session ID,以避免对 session 的攻击,如 session fixation :

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 for the current session and invalidate old session ID
$_SESSION['CREATED'] = time(); // update creation time
}

注意事项:

  • session.gc_maxlifetime 应至少等于此自定义过期处理程序的生命周期(本例中为 1800);
  • 如果您想在事件 30 分钟后结束 session ,而不是开始 30 分钟后,您还需要使用setcookie 过期 time()+60*30 以保持 session cookie 处于事件状态。

关于php - 如何在 30 分钟后使 PHP session 过期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3633682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com