理解PHP中的会话

时间:2014-09-08 06:58:17

标签: php session

我的问题:

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

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

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

1 个答案:

答案 0 :(得分:1)

  1. 好问题!我假设默认文件系统会话处理程序将关闭上次访问,但并非所有文件系统都支持atime时间戳。我会在这方面看到我能找到的东西。
  2. 默认情况下,会话存储为光盘上的文件。它们只在加载时占用内存。除非您构建了一个自定义会话处理程序,用于将会话存储在RAM光盘或内存缓存服务器或类似服务器中,或者除非您在用户会话中存储大量状态,否则我怀疑内存使用将是一个主要问题。
  3. 调用session_start()时,先前的会话数据将加载到PHP中。如果会话已过期,则不会加载会话数据,并且将创建新的空会话。所以,是的,如果你检查$ _SESSION中是否存在一个你期望永远在那里的变量,那么你可以使用它来确定用户的会话是否已经过期(但仅限于session_start()之后)被称为)。
  4. 只需将gc_max_lifetime设置为您希望会话持续多长时间(以秒为单位)。 600是10分钟,86400是一天等。
  5. 是(有一些警告,见下文)。
  6. 但是,您需要了解一些关于会话的事项。首先是会话的两个组件:服务器端状态记录,其中包含存储在会话中的所有数据,以及PHP用于将特定用户与特定状态记录相关联的客户端令牌。通常,客户端令牌是cookie。 Cookie有自己的到期日期,因此会话可能会在会话状态到期之前到期。在这种情况下,用户将停止发送令牌,并且会话状态实际上丢失。如果您要调整会话持续的时间,则需要设置服务器端状态到期时间和客户端cookie到期时间。

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