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