关于自定义SESSION处理器的类

本类是采用数据库做为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回收机制的调用,好大的一个坑



猜你喜欢

转载自blog.csdn.net/ddv1999/article/details/80193259