php实现将Session写入数据库
使用session_set_save_handler()函数,将Session的内容写入数据库
<?php
/*
*@authorFahy
*数据库为mysql,
*数据库名为session,表名为session,
*表中字段包括PHPSESSID,update_time,client_ip,data
*/
classSession{
privatestatic$handler=null;
privatestatic$ip=null;
privatestatic$lifetime=null;
privatestatic$time=null;
//配置静态变量
privatestaticfunctioninit($handler){
self::$handler=$handler;//获取数据库资源
self::$ip=!empty($_SERVER["REMOTE_ADDR"])?$_SERVER["REMOTE_ADDR"]:'unkonw';//获取客户端ip
self::$lifetime=ini_get('session.gc_maxlifetime');//获取session生命周期
self::$time=time();//获取当前时间
}
//调用session_set_save_handler()函数并开启session
staticfunctionstart($pdo){
self::init($pdo);
session_set_save_handler(
array(__CLASS__,'open'),
array(__CLASS__,'close'),
array(__CLASS__,'read'),
array(__CLASS__,'write'),
array(__CLASS__,'destroy'),
array(__CLASS__,'gc')
);
session_start();
}
publicstaticfunctionopen($path,$name){
returntrue;
}
publicstaticfunctionclose(){
returntrue;
}
//查询数据库中的数据
publicstaticfunctionread($PHPSESSID){
$sql="selectPHPSESSID,update_time,client_ip,datafromsessionwherePHPSESSID=?";
$stmt=self::$handler->prepare($sql);
$stmt->execute(array($PHPSESSID));
if(!$result=$stmt->fetch(PDO::FETCH_ASSOC)){
return'';
}
if(self::$ip==$result['client_ip']){
self::destroy($PHPSESSID);
return'';
}
if(($result['update_time']+self::$lifetime)<self::$time){
self::destroy($PHPSESSID);
return'';
}
return$result['data'];
}
/*
*首先查询该session是否存在数据,如果存在,则更新数据,如果不存在,则插入数据
*/
//将session写入数据库中,$data传入session中的keys和values数组
publicstaticfunctionwrite($PHPSESSID,$data){
$sql="selectPHPSESSID,update_time,client_ip,datafromsessionwherePHPSESSID=?";
$stmt=self::$handler->prepare($sql);
$stmt->execute(array($PHPSESSID));
if($result=$stmt->fetch(PDO::FETCH_ASSOC)){
if($result['data']!=$data||self::$time>($result['update_time']+30)){
$sql="updatesessionsetupdate_time=?,data=?wherePHPSESSID=?";
$stmt=self::$handler->prepare($sql);
$stmt->execute(array($self::$time,$data,$PHPSESSID));
}
}else{
if(!empty($data)){
try{
$sql="insertintosession(PHPSESSID,update_time,client_ip,data)values(?,?,?,?)";
}catch(PDOException$e){
echo$e->getMessage();
}
$sth=self::$handler->prepare($sql);
$sth->execute(array($PHPSESSID,self::$time,self::$ip,$data));
}
}
returntrue;
}
publicstaticfunctiondestroy($PHPSESSID){
$sql="deletefromsessionwherePHPSESSID=?";
$stmt=self::$handler->prepare($sql);
$stmt->execute(array($PHPSESSID));
returntrue;
}
publicstaticfunctiongc($lifetime){
$sql="deletefromsessionwhereupdate_time<?";
$stmt=self::$handler->prepare($sql);
$stmt->execute(array(self::$time-$lifetime));
returntrue;
}
}
//使用PDO连接数据库
try{
$pdo=newPDO("mysql:host=localhost;dbname=session","root","hwj193");
}catch(PDOException$e){
echo$e->getMessage();
}
//传递数据库资源
Session::start($pdo);
以上所述就是本文的全部内容了,希望大家能够喜欢。