7

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

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

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

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

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

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

4

1 回答 1

8

PHP 的默认会话处理程序使用 将 $_SESSION 数据存储在一个文件中serialize(),该文件位于session.save_path. 通常文件名看起来像$filename = 'sess_' . session_id().

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

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

于 2012-06-17T14:30:09.723 回答