我的问题:
session.gc_maxlifetime
inphp.ini
:session.gc_maxlifetime
是从session_start()点开始还是最近向服务器请求? (假设我有一些没有调用 session_start() 的请求。)使用
$_SESSION
对象的最佳实践是什么,以免浪费宝贵的 RAM(及时自动清除空闲 session )?或者这是在session.gc_maxlifetime
中提到的时间自动发生的事情?- 如何正确检查 session 是否已过期(相对于从未创建的 session )?或者两者相同?
isset($_SESSION['any_variable']) === FALSE
- 假设我无法控制 php.ini,我该如何增加
session.gc_maxlifetime
? session_start()
:如果一个 session “超时”,调用 session_start 将始终启动一个 session ,而之前的变量不可用(一个全新的 session )。对吗?
最佳答案
- 好问题!我假设默认的文件系统 session 处理程序将关闭最后一次访问,但并非所有文件系统都支持 atime 时间戳。我会看看我能在这方面找到什么。
- session 默认存储为光盘上的文件。它们只在加载时占用内存。除非你已经构建了一个自定义 session 处理程序,将 session 存储在 RAM 磁盘或内存缓存服务器或类似的服务器中,或者除非你在用户 session 中存储大量状态,否则我怀疑内存使用将是一个主要问题。
- 当调用 session_start() 时,先前的 session 数据被加载到 PHP 中。如果 session 已过期,则不会加载任何 session 数据,并且会创建一个新的空 session 。所以是的,如果您检查 $_SESSION 中是否存在您期望始终存在的变量,那么您可以使用它来确定用户的 session 是否已过期(但仅在调用 session_start() 之后)。
- 只需将 gc_max_lifetime 设置为您希望 session 持续的时间(以秒为单位)。 600为10分钟,86400为1天等。
- 是的(有一些注意事项,见下文)。
不过,对于 session ,您需要注意一些事项。首先是 session 有两个组件:服务器端状态记录保存 session 中存储的所有数据,以及 PHP 用来将特定用户与特定状态记录相关联的客户端 token 。通常,客户端 token 是一个 cookie。 Cookie 有自己的过期日期,因此 session 可能会在 session 状态到期之前过期。在那种情况下,用户将停止发送 token 并且 session 状态实际上丢失了。如果您要调整 session 持续时间,则需要同时设置服务器端状态过期时间和客户端 cookie 过期时间。
至于陈旧状态, session 垃圾收集系统并不总是在每次调用 session_start() 时都运行。如果是这样的话,开销将严重影响具有大量 session 的大型 PHP 站点。有配置选项指定 GC 在任何给定的 session_start 调用上运行的概率(我相信它默认为 1%)。如果它没有运行,那么过时的 session 记录可能仍被视为有效并用于填充 $_SESSION。它可能不会对您的系统产生严重影响,但您需要牢记这一点。
关于php - 了解 PHP 中的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25718868/