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);
以上所述就是本文的全部内容了,希望大家能够喜欢。