<?php ini_set('session.gc_maxlifetime',10); ini_set('session.gc_probability ' ,1); ini_set('session.gc_divisor',5 ); class FileSessionHandler { private $savePath; function open($savePath, $sessionName) { $this->savePath = $savePath; if (!is_dir($this->savePath)) { mkdir($this->savePath, 0777); } echo __FUNCTION__."<BR>"; return true; } function close() { echo __FUNCTION__."<BR>"; return true; } function read($id) { echo __FUNCTION__."<BR>"; return (string)@file_get_contents("$this->savePath/sess_$id"); } function write($id, $data) { echo __FUNCTION__."<BR>"; return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true; } function destroy($id) { $file = "$this->savePath/sess_$id"; if (file_exists($file)) { unlink($file); } echo __FUNCTION__."<BR>"; return true; } function gc($maxlifetime) { foreach (glob("$this->savePath/sess_*") as $file) { if (filemtime($file) + $maxlifetime < time() && file_exists($file)) { unlink($file); } } echo __FUNCTION__."<BR>"; return true; } function end(){ echo '我是最后脚本结束register_shutdown_functiond调用'."<br>"; } } $handler = new FileSessionHandler(); session_set_save_handler( array($handler, 'open'), array($handler, 'close'), array($handler, 'read'), array($handler, 'write'), array($handler, 'destroy'), array($handler, 'gc') ); // 下面这行代码能够防止使用对象做为会话保存管理器时可能引起的非预期行为 register_shutdown_function(array($handler,end)); session_start(); $_SESSION['name']='tb'; // session_commit(); // session_write_close(); // 若是开启,那顺序就是open read (gc) write close // session_destroy(); // session_regenerate_id(true);
运行后以下图所示:php
默认是session_start分别调用的回调函数。为open read ,而后等待脚本结束,收集$_SESSION
(默认在内存中),而后关闭脚本,而后执行write,写入文件,而后close。linux
那么咱们使用 session_commit();
或者 session_write_close();
函数调用的时候,session的机制就改变了,直接写入文件,关闭文件。而后再执行脚本。以下图所示:segmentfault
那么session_dessory
调用的时候,就是在read以后,由于只要sesson_start
开启,先执行的就是open 和read。
那么gc呢,咱们都知道gc是根据 session.gc_probability
和 session.gc_divisor
参数控制。本例中我设置了他们的比例为5,可是如今的问题是我刷新5+次可能也调用不了一次gc。可能和个人win平台有关系。若是命中gc,并且没有调用 session_commit();
或者 session_write_close();
函数,运行流程以下图所示:session
ps:因为都是在win上测试,可能对gc的回收不是很准确,包括即便我设置为1:1,百分之百回收。在win上仍然存在这个sessionid
文件,可能缘由是session 锁机制,我在linux上测试了再分享给你们。
另外session的相关也可参考
该问题已经澄清,请移步php Session gc机制下在window下与ununtu是不一样的。函数