php - 了解 PHP 中的 session

标签 php session

我的问题:

  1. session.gc_maxlifetime in php.ini: session.gc_maxlifetime是从session_start()点开始还是最近向服务器请求? (假设我有一些没有调用 session_start() 的请求。)

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

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

最佳答案

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

不过,对于 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/

相关文章:

javascript - 我应该使用哪种文本编辑器进行HTML编码?

php - PHP tokenizer的一些实际用途是什么?

python - 检测python变量值的变化

php - 使用foreach向数据库插入数据

php - ppa :ondrej/nginx? 的目的是什么

php - 如何找到foreach索引?

经典 ASP 站点中的新请求导致 session 丢失

java - Hibernate Session如果长时间不使用会释放db连接吗

node.js - 如何在 node.js 中使用 Passport 访问序列化用户

php - ajax检查用户在运行脚本之前登录