ini_set 'session.gc_maxlifetime' 为 1 天

2024-06-20

If I do:

ini_set('session.gc_maxlifetime', 86400);

这是否意味着用户可以将浏览器留在同一页面(非活动状态)最多 1 天,而不必担心会话被垃圾收集并被注销?

如果服务器配置不支持此功能会发生什么? (它会给我一个错误吗?或者只是默默地失败?)

默认的垃圾收集时间是 24 分钟,这在我的系统中很容易发生。

垃圾收集是否在 session_start 上运行?


对于像你这样的问题,我倾向于直接访问每个 ini 设置中存在的 PHP 手册页:http://php.net/session.gc_maxlifetime http://php.net/session.gc_maxlifetime :

session.gc_maxlifetime integer

会话.gc_maxlifetime指定多少秒后数据将被视为“垃圾”并可能被清除。垃圾收集可能会在会话启动期间发生(取决于session.gc_probability and session.gc_divisor).

  • 笔记: 如果不同的脚本具有不同的 session.gc_maxlifetime 值,但共享相同的位置来存储会话数据,则具有最小值的脚本将清理数据。在这种情况下,请将此指令与 session.save_path 一起使用。

  • 注意:如果您使用默认的基于文件的会话处理程序,您的文件系统必须跟踪访问时间 (atime)。 Windows FAT 则不然,因此,如果您被 FAT 文件系统或任何其他无法进行时间跟踪的文件系统所困扰,您将不得不想出另一种方法来处理会话的垃圾收集。从 PHP 4.2.3 开始,它使用 mtime(修改日期)而不是 atime。因此,对于无法进行时间跟踪的文件系统,您不会遇到问题。

将其映射到您的各种问题:

  • 这是否意味着用户可以将浏览器留在同一页面(非活动状态)最多 1 天,而不必担心会话被垃圾收集并被注销?

它仅意味着会话未被垃圾收集。如果用户由于其他原因丢失了会话 ID(例如 cookie 丢失或其他携带参数的会话 ID),则无论会话是否已被垃圾收集,用户都会看起来自己已注销。

  • 如果服务器配置不支持此功能会发生什么? (它会给我一个错误吗?或者只是默默地失败?)

那是 PHP 配置而不是服务器配置。但是,如果您没有以默认方式使用默认会话目录来放置文件,则它不会给您任何错误,并且会静默失败。服务器管理的职责是处理会话数据垃圾收集。

如果是标准配置但没有足够的文件权限,则会触发错误。

在内部,也可以启用会话调试,以便您可以获得有关已删除多少会话文件的消息。

另请参阅此相关问答:

  • 清理 php 会话文件 https://stackoverflow.com/q/654310/367456
  • 会话文件未清理 https://stackoverflow.com/a/6845361/367456
  • 默认的垃圾收集时间是 24 分钟,这在我的系统中很容易发生。

是的,默认设置是“1440” 代表 1440 秒,即 24 分钟。

您可以在此处的 PHP 源代码中找到它:

  • http://lxr.php.net/xref/PHP_5_5/ext/session/session.c#789 http://lxr.php.net/xref/PHP_5_5/ext/session/session.c#789

它也与 PHP 附带的建议 ini 设置使用的值相同。

另请参阅此相关问答:

  • PHP:会话的默认生命周期是多少 https://stackoverflow.com/q/156712/367456
  • 垃圾收集是否在 session_start 上运行?

是的,它确实。你可以在文末找到它session_start执行:

  • http://lxr.php.net/xref/PHP_5_5/ext/session/session.c#1465 http://lxr.php.net/xref/PHP_5_5/ext/session/session.c#1465

那么,在信息泛滥的情况下,我们应该吸取哪些教训呢? PHP 对会话数据进行垃圾收集,因为如果启用了会话,将很容易生成大量数据。使用会话保存目录的标准设置,它可以很快填满大量文件。我自己也经历过这种情况,因为我在一个应用程序中遇到了一些缺陷,其中标准垃圾收集没有启动(我更改了会话保存路径,因为该站点位于共享主机上,并且我自己的垃圾收集没有正确触发/配置),所以最后我能做的就是从 shell 访问该目录并让find做这项工作确实花了很长时间 - 但它确实有效。所以手动垃圾收集。

因此,请检查您的垃圾收集设置,并在一两天后验证这些设置是否按预期工作。

除了纯粹的垃圾收集之外,在应用程序中独立跟踪会话生命周期也是明智的。这是通过将会话创建时间和会话上次活动时间添加到会话中来实现的。如果您想要允许长时间运行的会话,甚至强制用户在一定时间跨度后重新登录,这将允许您重新生成会话 ID。

此外,这还可以保护您的会话处理,以应对那些会话尚未被垃圾收集器删除的情况,因为概率没有捕获它或者因为它是唯一可用的会话。由于垃圾收集器启动的设计问题after会话已经开始,垃圾收集器可以never删除当前会话。

我希望这能回答您的问题并为您提供一些指导。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ini_set 'session.gc_maxlifetime' 为 1 天 的相关文章

随机推荐