如果我这样做:
ini_set('session.gc_maxlifetime', 86400);
这是否意味着用户可以将浏览器保留在同一页面上(非活动状态)最多1天,而无需担心会话被垃圾回收并被注销?
如果服务器配置不支持,会发生什么? (它会给我一个错误吗?或者只是默默地失败?)
默认的垃圾回收时间是24分钟,这可能很容易在我的系统中发生。
垃圾收集是否在session_start上运行?
答案 0 :(得分:11)
对于像你这样的问题,我倾向于指向每个ini设置中存在的PHP手册页:http://php.net/session.gc_maxlifetime:
session.gc_maxlifetime
整数session.gc_maxlifetime 指定将数据视为'垃圾'之后的秒数。并可能清理。会话开始时可能会收集垃圾(取决于
session.gc_probability
和session.gc_divisor
)。
注意: 如果不同的脚本具有不同的session.gc_maxlifetime值,但共享相同的位置来存储会话数据,则具有最小值的脚本将清除数据。在这种情况下,请将此指令与session.save_path一起使用。
注意:如果您使用的是基于文件的默认会话处理程序,则您的文件系统必须跟踪访问时间(atime)。如果您遇到FAT文件系统或任何其他无法进行atime跟踪的文件系统,那么Windows FAT不会如此,您将不得不想出另一种方法来处理垃圾收集会话。从PHP 4.2.3开始,它使用了mtime(修改日期)而不是atime。因此,您无法在没有时间跟踪的文件系统中遇到问题。
要在各种问题上进行映射:
- 这是否意味着用户可以将浏览器保留在同一页面上(非活动状态)最多1天,而无需担心会话被垃圾回收并被注销?
这只表示会话不是垃圾回收。如果用户由于某些其他原因(例如,cookie丢失或其他会话ID携带参数)而丢失了会话ID,则无论会话是否已被垃圾回收,用户都会被注销。
- 如果服务器配置不支持,会发生什么? (它会给我一个错误吗?或者只是默默地失败?)
那是PHP配置而不是服务器配置。但是,如果您没有使用默认会话目录以默认方式将文件放在那里,它就不会给您任何错误并且会无声地失败。它是服务器管理的业务,用于处理会话数据垃圾收集。
如果是标准配置但文件权限不足,则会触发错误。
在内部,也可以启用会话调试,以便您可以获取有关已删除的会话文件数的消息。
参见这个相关的Q& A:
- 默认的垃圾回收时间是24分钟,这可能很容易在我的系统中发生。
是的,默认设置为" 1440
"它代表1440秒,即24分钟。
您可以在PHP源代码中找到它:
它也与PHP附带的建议ini-settings使用的值相同。
参见这个相关的Q& A:
- 垃圾收集是否在session_start上运行?
是的。您可以在session_start
实施结束时找到它:
所有这些信息溢出,哪些经验值得学习? PHP具有会话数据的垃圾收集,因为如果启用了会话,则很容易生成大量数据。使用会话保存目录的标准设置,它可以很快填满大量文件。我之所以经历过这种情况,是因为我在应用程序中遇到了一些缺陷,标准垃圾收集没有启动(我改变了会话保存路径,因为该站点位于共享的托管服务器上,我自己的垃圾收集是没有正确触发/配置),所以最后我所能做的就是从shell访问该目录,让find
完成真正花费很长时间的工作 - 但它确实有效。所以手动垃圾收集。
请检查您的垃圾收集设置,并在一两天后验证这些设置是否正常工作。
除了纯垃圾收集之外,它还可以在您的应用程序中独立跟踪会话生命周期。这可以通过将会话创建时间和会话上次活动时间添加到会话中来实现。如果您想允许长时间运行的会话,甚至强制用户在一定的时间跨度后重新登录,这将允许您重新生成会话ID。
此外,这可以保护您的会话处理,以防止到目前为止垃圾收集器尚未删除会话的情况,因为概率没有捕获它,或者因为它是唯一可用的会话。对于会话启动后垃圾收集器在中启动的设计问题,垃圾收集器可以永远不会删除当前会话。
我希望这可以回答您的问题,并为您提供一些指导。