【问题标题】:Understanding sessions in PHP了解 PHP 中的会话
【发布时间】:2014-09-08 06:58:16
【问题描述】:

我的问题:

  1. session.gc_maxlifetime in php.inisession.gc_maxlifetime 是从 session_start() 点开始还是从服务器的最新请求开始? (假设我有几个请求没有调用 session_start()。)

  2. 使用$_SESSION 对象的最佳做法是什么,以免浪费宝贵的RAM(及时自动清除空闲会话)?或者这是在session.gc_maxlifetime 中提到的时间自动发生的事情?

  3. 如何正确检查会话是否已过期(相对于从未创建的会话)?还是两者都一样? isset($_SESSION['any_variable']) === FALSE
  4. 假设我无法控制 php.ini,如何增加session.gc_maxlifetime
  5. session_start():如果会话“超时”,则调用 session_start 将始终启动先前变量不可用的会话(全新会话)。对吗?

【问题讨论】:

标签: php session


【解决方案1】:
  1. 好问题!我会假设默认文件系统会话处理程序将关闭最后一次访问,但并非所有文件系统都支持 atime 时间戳。我会看看我能在这方面找到什么。
  2. 默认情况下,会话作为文件存储在磁盘上。它们仅在加载时占用内存。除非您构建了一个自定义会话处理程序,将会话存储在 RAM 磁盘或内存缓存服务器或类似服务器中,或者除非您在用户会话中存储大量状态,否则我怀疑内存使用将是一个主要问题。
  3. 当 session_start() 被调用时,之前的会话数据被加载到 PHP 中。如果会话已过期,则将没有要加载的会话数据,并且将创建一个新的空会话。所以是的,如果您检查 $_SESSION 中是否存在您期望始终存在的变量,那么您可以使用它来确定用户的会话是否已过期(但仅在调用 session_start() 之后)。
  4. 只需将 gc_max_lifetime 设置为您希望会话持续多长时间(以秒为单位)。 600是10分钟,86400是一天,以此类推
  5. 是的(有一些注意事项,见下文)。

不过,您需要注意一些关于会话的事项。首先是会话有两个组件:一个服务器端状态记录,它保存存储在会话中的所有数据,以及一个客户端令牌,PHP 使用它来将特定用户与特定状态记录相关联。通常客户端令牌是一个cookie。 Cookie 有自己的到期日期,因此会话可能会在会话状态到期之前到期。在这种情况下,用户将停止发送令牌并且会话状态实际上会丢失。如果要调整会话的持续时间,则需要同时设置服务器端状态过期时间和客户端 cookie 过期时间。

对于陈旧状态,会话垃圾收集系统并不总是在每次调用 session_start() 时运行。如果这是开销,那么对于一个有很多会话的大型 PHP 站点来说,这将是一个沉重的负担。有一些配置选项指定 GC 在任何给定的 session_start 调用上运行的概率(我相信它默认为 1%)。如果它没有运行,那么陈旧的会话记录仍可能被视为有效并用于填充 $_SESSION。它可能不会对您的系统产生严重影响,但您需要牢记这一点。

【讨论】:

  • 回复有点晚了,我已经接受了你的回答。但是对于第四季度,我确实没有 可以控制 php.ini。对此有什么想法吗? :)
  • 取决于您是否对 PHP 的配置有任何影响,例如能够使用 .htaccess 修改设置等。如果你对它完全没有影响,那么你可能会被卡住。
猜你喜欢
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多