php - PHP 如何检测 session 超时?

标签 php session

我想知道 PHP 如何检测到特定 session 已超时。

详细说明:我正在使用默认的(基于文件的) session 处理程序,具有默认的 session 生命周期等等。 php.ini 中的所有内容都是默认的。

如果 session 现在开始,PHP 会检查(取决于非 session.gc_divisor 和 session.gc_probability)是否有任何超时 session 。但是,PHP 从哪里获取 session 的最后 session 访问时间以进行检查?

session 文件本身仅包含工作负载,例如x|i:1; 对于 $_SESSION['x'] = 1;,因此没有关于上次 session 访问时间的信息。

我认为没有与 session 开始时间相关的内存信息,因为 session 在完全服务器重启后仍在工作。

那么,PHP 从哪里获取信息呢?是比较session文件的mtime/ctime吗?

最佳答案

PHP 的默认 session 处理程序使用 serialize() 将 $_SESSION 数据存储在文件中,该文件位于 session.save_path 指定的目录中。通常,文件名类似于 $filename = 'sess_' 。 session_id().

因为它只是一个文件,PHP 可以使用文件的 mtime(上次修改时间)来确定哪些 session 文件是过时的。基本上它会抓取所有 mtime 超过 session.gc_maxlifetime 值的 session 文件并 unlink() 它们。正如您所说,发生清理的概率由 session.gc_* ini 变量控制。

现在,如果您使用 session_set_save_handler() 创建自己的 session 处理程序,这一切都在窗外,您现在可以控制 session 的存储和清理方式,但这确实解释默认行为。

关于php - PHP 如何检测 session 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072003/

相关文章:

node.js - req.session.destroy() 在 Nodejs 中不起作用

php - session 与图像 PHP 不匹配

php - 我如何与 Coinbase 的 API 交互?为什么总是失败?

javascript - 如何查找表中的RowIndex

php - 自定义 WP 主题时,我应该将导航栏放在 `<body>` 标签之前还是之后?

php - Laravel Blade Comment 导致 CONNECTION_RESET

PHP session_start() 覆盖 HTTP Expires header

php - 音频搜索不起作用

mysql - 如何将新项目插入 session 而不覆盖以前的值 ASP/VB.NET

asp.net - 访问 ASP.NET 中的状态