我想知道PHP如何检测到特定会话已超时。
详细说明:我正在使用默认的(基于文件的)会话处理程序,具有默认的会话生存期等等。 php.ini中的所有内容都是默认的。
如果现在启动了一个会话,如果有任何超时会话,PHP会进行检查(取决于非session.gc_divisor和session.gc_probability)。但是从哪里获取PHP会话的最后一个会话访问时间来检查?
会话文件本身仅包含工作负载,例如x|i:1;
为$_SESSION['x'] = 1;
,因此没有关于上次会话访问时间的信息。
我认为没有与会话开始时间相关的内存信息,因为在完整服务器重启后会话仍在工作。
那么,PHP从何处获取信息?它是在比较会话文件的mtime / ctime吗?
答案 0 :(得分:8)
PHP的默认会话处理程序在serialize()
指定的目录中使用session.save_path
将$ _SESSION数据存储在文件中。通常,文件名看起来像$filename = 'sess_' . session_id()
。
由于它只是一个文件,PHP可以使用该文件的mtime(上次修改时间)来确定哪些会话文件是陈旧的。基本上它会抓取mtime超过session.gc_maxlifetime
值且unlink()
值的所有会话文件。正如您所说,清除发生的可能性由session.gc_*
ini变量决定。
现在,如果您使用session_set_save_handler()
创建自己的会话处理程序,这就完全不在窗口中,您现在可以控制会话的存储和清理方式,但这确实解释了默认行为。