<?php
//原创:xuduowei,想学习php开发的可以找我。微信号:weilanweb
class session_mysql{
//private static $db=null;
private static $ip=null;
private static $lifetime=null;
private static $time=null;
private static function init(){
//self::$db=$db;
self::$ip=!empty($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : "unknown";
self::$lifetime=ini_get('session.gc_maxlifetime');
self::$time=time();
}
public static function start(){
self::init();
session_set_save_handler(
array(__CLASS__, "open"),
array(__CLASS__, "close"),
array(__CLASS__, "read"),
array(__CLASS__, "write"),
array(__CLASS__, "destroy"),
array(__CLASS__, "gc")
);
session_start();
}
public static function open($path, $name){
//return true;
}
public static function close() {
//return true;
}
public static function read($id){
echo "read读取信息<br>";
}
public static function write($id ,$data){
echo "write写信息<br>";
//return true;
}
public static function destroy($id){
echo "destroy清除信息<br>";
}
private static function gc($lifetime){
echo "gc回收信息<br>";
}
}
session_mysql::start();
echo session_name().'='.session_id()."<br>";
?>
输出结果:
read读取信息
PHPSESSID=2jo24tkjjqgu8jq1p6u2aijnd3
write写信息
=========================================
以phpstudy环境为例:默认的J:\phpStudy\tmp\tmp session存储路径下并不会有session文件的存储。php.ini配置文件中依然是默认的:session.save_handler = files
=========================================
这样做的目的就是方便后期把session写入数据库中。
以下为数据库融合版【xuduowei 原创】:
class db{
var $conn;
function __construct(){
$conn=mysqli_connect("主机","用户名","密码");//为了方便,我这直接写。
if(!$conn){
echo "数据库连接失败";
die;
}
mysqli_select_db($conn,"数据库");//为了方便,我这直接写。
$this->conn=$conn;
//return $conn;
}
function select($sql){
$rst=mysqli_query($this->conn,$sql);
$arr=array();
while($rs=mysqli_fetch_assoc($rst)){
$arr[]=$rs;
}
return $arr;
}
function query($sql){
//用户数据库的删除操作
return mysqli_query($this->conn,$sql);
}
}//end db
class session_mysql{
private static $db=null;
private static $ip=null;
private static $lifetime=null;
private static $time=null;
private static function init($db){
self::$db=$db;
self::$ip=!empty($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : "unknown";
self::$lifetime=ini_get('session.gc_maxlifetime');
self::$time=time();
}
public static function start($db){
self::init($db);
session_set_save_handler(
array(__CLASS__, "open"),
array(__CLASS__, "close"),
array(__CLASS__, "read"),
array(__CLASS__, "write"),
array(__CLASS__, "destroy"),
array(__CLASS__, "gc")
);
session_start();
}
public static function open($path, $name){
return true;
}
public static function close() {
return true;
}
public static function read($id){
echo "read读取信息<br>";
$sql="select sessionid,updatetime,data from xdw_session where sessionid='".$id."'";
$result=self::$db->select($sql);
if(!$result[0]){//若没有值,就返回空。
return "";
}
if ((strtotime($result[0]["updatetime"])+self::$lifetime) < self::$time){
//echo "时间过期";
self::destroy($id);
return '';
}
return $result[0]['data'];
}
public static function write($id ,$data){//sessionid和session 值
echo "write写信息<br>";
$sql="select sessionid,updatetime,data from xdw_session where sessionid='".$id."'";
$result=self::$db->select($sql);
//若有值
if($result[0]){
//若session内容不一致,或者超出一段时间300秒了【还没有过期】。我们就重新更新一次。
if($result[0]['data'] != $data || self::$time > (strtotime($result[0]['updatetime'])+300)){
$sql="update xdw_session set updatetime = '".date("Y-m-d H:i:s")."', data ='".$data."' where sessionid ='".$id."'";
self::$db->query($sql);
}
}else{//若没有值,就所以这个sessionid不存在。我们就重新写入一次。
$sql="insert into xdw_session set updatetime = '".date("Y-m-d H:i:s")."', data ='".$data."' ,sessionid ='".$id."'";
self::$db->query($sql);
}
return true;
}
public static function destroy($id){
echo "destroy清除信息<br>";
$sql="delete from xdw_session where sessionid ='".$id."'";
self::$db->query($sql);
return true;
}
private static function gc($lifetime){
echo "gc回收信息<br>";//也就是删除过期的
$time=self::$time-$lifetime;
$sql = "delete from xdw_session where unix_timestamp(updatetime) < ".$time;
self::$db->query($sql);
return true;
}
}
session_mysql::start(new db());
echo session_name().'='.session_id()."<br>";
$_SESSION['username']="xuduowei";
附上数据库表结构:
#有想学习php开发的,可以联系我。电话:15309695130 php著名老师:xuduowei
DROP TABLE IF EXISTS `xdw_session`;
CREATE TABLE `xdw_session` (
`session_id` varchar(32) NOT NULL,
`data` text NOT NULL,
`expire` datetime NOT NULL,
PRIMARY KEY (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
xuduowei 原创作品,请勿转载,谢谢合作。