本类是采用数据库做为SESSION数据区持久化的方案
因此先上数据表结构:session(表名)
#建立数据库test create database if not exists test charset=utf8; #打开数据库 use test; #建立表 create table if not exists `session` ( session_id varchar(40) not null default '', session_content text, last_time int not null default 0, primary key(session_id) )charset=utf8 engine=myisam; #为数据库test添加指用户:test2018,密码:1234abcd; grant all on test.* to 'test2018
然后应当还有采用PDO操作数据库的方案,PDO的类,在另一个文章中
https://blog.csdn.net/ddv1999/article/details/80167064
再上本例的相关代码
<?php require_once 'pdodb.class.php'; class model extends pdodb{ //protected $_dao; //private $_dao; public $_dao; function __construct(){ $cs=array(//连接数组 'host' =>'127.0.0.1', 'port' =>'3306', 'username' =>'test2018', 'password' =>'1234abcd', 'dbname' =>'test', 'charset' =>'utf8', ); $this->_dao=pdodb::getdb($cs); //$this->_dao->test(); //echo "<pre>"; //var_dump($this->_dao); //echo "</pre>"; } } class sessiondb extends model{ public function __construct() { //启用父类的构造,凡是有继承的类,在构造时,注意会覆盖掉父类的构造。 //本类就被父类的构造坑了。没有此句,父类的_dao是空的。 parent::__construct(); //设置session处理器 ini_set('session.save_handler', 'user'); session_set_save_handler( array($this,'uBegin'), array($this,'uEnd'), array($this,'uRead'), array($this,'uWrite'), array($this,'uDelete'), array($this,'uGC') ); //开启 session_start(); echo "<pre>"; //var_dump($this->_dao);//不调用父类的构造,此处是NULL //var_dump(new self()); echo "</pre>"; } //private $_dao; //1-Begin开始 function uBegin() { echo "<br>begin"; return true; } //2-End结束 function uEnd() { echo "<br>end"; return true; } //3-Read读 /** * 读操作 * 执行时机: session机制开启程中执行 * 工作: 从当前session数据区读取内容 * @param $sess_id string * @return string */ function uRead($sess_id) { echo "<br>read"; echo "<br>本次ID:$sess_id"; $sql = "SELECT session_content FROM session WHERE session_id='$sess_id'"; //echo "<pre>"; //var_dump($this->_dao); //echo "</pre>"; $a=$this->_dao->getone($sql); echo "<pre>"; var_dump($a); //var_dump($a); echo "</pre>"; echo "<br>".gettype($a); //die(); if(gettype($a)=='string'){ echo "<br>查到并返回SESSION数据"; return $a; } echo "<br>不存在SESSION数据,返回空字符串''"; return ''; } //4-Write写 /** * 写操作 * 执行时机: 脚本周期结束时,PHP在整理收尾时 * 工作: 将当前脚本处理好的session数据,持久化存储到数据库中! * @param $sess_id string * @param $sess_content string 序列化好的session内容字符串 * @return bool */ function uWrite($sess_id,$sess_content) { echo "<br>write"; echo "<br>本次写入的ID:".$sess_id."本次写入的内容".$sess_content; $sql = "REPLACE INTO `session` VALUES ('$sess_id', '$sess_content', unix_timestamp())"; $a=$this->_dao->getone($sql); //echo "<pre>"; //var_dump($a); //echo "</pre>"; //die(); if($a===false){ echo "<br>执行失败"; return false; } echo "<br>执行成功"; return true; } //5-Delete删除 /** * 删除操作 * 执行时机: 调用了session_destroy()销毁session过程中被调用 * 工作: 删除当前session的数据区(记录) * @param $sess_id string * @return bool */ function uDelete($sess_id) { echo "<br>delete"; $sql = "DELETE FROM `session` WHERE session_id='$sess_id'"; $a=$this->_dao->getone($sql); echo "<pre>"; var_dump($a); echo "</pre>"; if($a===false){ echo "<br>执行失败"; return false; } echo "<br>执行成功"; return true; } //6-GC回收机制 /** * 垃圾回收操作 * 执行时机: 开启session机制时,有概率的执行 * 工作: 删除那些所有过期的session数据区 * @param $max_lifetime * @return bool */ function uGC() { echo "<br>GC"; //删除 //$a=get_cfg_var('session.gc_maxlifetime'); $a=5;//为了更快的看到GC的执行效果,数据区有效期改成5秒 $sql = "DELETE FROM `session` WHERE last_time<unix_timestamp()-$a"; $a=$this->_dao->getone($sql); echo "<pre>"; var_dump($a); echo "</pre>"; if($a===false){ echo "<br>执行失败"; return false; } echo "<br>执行成功"; return true; //return $this->_dao->getone($sql); //return true; } } //$aaa=new model(); //1开启session new sessiondb(); $_SESSION['admin']="登录成功"; //echo "<pre>"; //var_dump($_SESSION); //echo "</pre>"; /* //提高回收的概率的配置PHP.INI命令 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','1'); //1开启session //session_start(); new sessiondb; //2、清空session信息 //die("实在想不出,还有什么地方可以消灭$_SESSION数组"); $_SESSION = array(); //3、清除客户端sessionid if(isset($_COOKIE[session_name()])){ setCookie(session_name(),'',time()-1,'/'); } //4、彻底销毁session session_destroy(); */
只是个学习用的例子,具体应用,还要是依实际情况去改造,主要为了了解运行机制
比如:如果read读方法,返回值(空串/字符串)会影响GU回收机制的调用,好大的一个坑