php基于session实现数据库交互的类实例
本文实例讲述了php基于session实现数据库交互的类。分享给大家供大家参考。具体如下:
<?php
/**
*session数据库存储类
*/
classSession{
privatestatic$session_id=0;
privatestatic$session_data=array();
privatestatic$is_update=FALSE;
privatestatic$is_del=FALSE;
privatestatic$is_gc=FALSE;
privatestatic$dbo=NULL;//数据库连接句柄
privatestatic$gc_max_time=1440;
privatestatic$table='sessions';
privatestatic$pre_key='weige';//session密钥
//捆绑使用哈
privatestatic$gc_rate_de=100;//代表分母
privatestatic$gc_rate_co=20;//代表分子
privatestatic$path='/';//保存路径
privatestatic$domain=null;//域
privatestatic$secure=false;//默认
privatestatic$httponly=false;//默认
/**
*获取数据库句柄私有
*/
privatestaticfunctionopen()
{
if(!self::$dbo)
{
self::$dbo=Db::factory();
}
returnTRUE;
}
/**
*设置
**/
publicstaticfunctionset($key,$val=NULL)
{
self::open();
$data=self::read();
if($data===FALSE)
{
$data=array();
}
if(!$val&&is_array($key))
{
$data=$key;
}
elseif($val&&is_string($key))
{
$data[$key]=$val;
}
self::write($data);
self::close();
}
/**
*获取值
*
*/
publicstaticfunctionget($key=NULL){
self::open();
self::$session_data=self::read();
$ret='';
if(!$key){
$ret=self::$session_data;
}elseif(is_array(self::$session_data)&&isset(self::$session_data[$key])){
$ret=self::$session_data[$key];
}
self::update();
self::close();
return$ret;
}
/**
*删除或者重置
**/
publicstaticfunctiondel($key)
{
if(!self::$is_del)
{
self::open();
$val=self::read();
if(isset($val[$key]))
{
unset($val[$key]);
}
$session_id=self::$session_id;
$session_data=serialize($val);
$session_expire=TIME+self::get_gc_maxtime();
self::$dbo->query("update".self::$table."setvalue='$session_data',expiry='$session_expire'wheresession_id='$session_id'");
self::close();
}
self::$is_del=TRUE;
}
/**
*销毁
*
**/
publicstaticfunctiondestroy()
{
$session_id=self::get_session_id();
$_COOKIE['WBSID']='';
self::open();
self::$dbo->query("deletefrom".self::$table."wheresession_id='$session_id'");
self::close();
}
/**
*读取私有
**/
privatestaticfunctionread()
{
$session_id=self::$session_id;
if(!$session_id){
$session_id=self::get_session_id();
}
if(!$session_id)returnarray();
$user_agent=isset($_SERVER['HTTP_USER_AGENT'])?md5($_SERVER['HTTP_USER_AGENT']):'';
$client_ip=Fun::getIp();
$session_expire=TIME-self::get_gc_maxtime();
$rs=self::$dbo->fetchRow("selectsession_id,value,agent,ipfrom".self::$table."
wheresession_id='$session_id'andexpiry>'$session_expire'");
if(!$rs||$rs['agent']!=$user_agent||$rs['ip']!=$client_ip)
{
returnFALSE;
}
self::$session_id=$rs['session_id'];
returnunserialize($rs['value']);
}
/**
*session写入私有
**/
privatestaticfunctionwrite(array$session_data)
{
$session_id=self::$session_id;
if(!$session_id)
{
$session_id=self::get_session_id();
}
$session_expire=TIME+self::get_gc_maxtime();
$user_agent=isset($_SERVER['HTTP_USER_AGENT'])?md5($_SERVER['HTTP_USER_AGENT']):'';
$client_ip=Fun::getIp();
$session_data=serialize($session_data);
if(self::$session_id&&self::$session_id===$session_id)
{
self::$dbo->query("update".self::$table."setvalue='$session_data',expiry='$session_expire',agent='$user_agent',ip='$client_ip'wheresession_id='$session_id'");
}
else
{
self::$session_id=$session_id=self::create_session_id();
self::$dbo->query("insertinto".self::$table."(session_id,value,expiry,agent,ip)
values('$session_id','$session_data','$session_expire','$user_agent','$client_ip')");
}
returntrue;
}
/**
*session更新私有
**/
privatestaticfunctionupdate()
{
if(!self::$is_update)
{
$session_id=self::$session_id;
$session_expire=TIME+self::get_gc_maxtime();
self::$dbo->query("update".self::$table."setexpiry='$session_expire'wheresession_id='$session_id'");
}
self::$is_update=TRUE;
}
privatestaticfunctionclose()
{
if(!self::$is_gc&&mt_rand(1,self::$gc_rate_de)%self::$gc_rate_co==0)
{
self::gc();
}
self::$is_gc=TRUE;
}
/**
*过期session清除随机触发
**/
privatestaticfunctiongc()
{
$session_expire=TIME-self::get_gc_maxtime();
self::$dbo->query("deletefrom".self::$table."whereexpiry<'$session_expire'");
}
privatestaticfunctionget_session_id()
{
if(isset($_COOKIE['WBSID'])&&strlen($_COOKIE['WBSID'])==32)
{
$sid=$_COOKIE['WBSID'];
setcookie('WBSID',$sid,TIME+self::get_gc_maxtime(),self::$path,self::$domain,self::$secure,self::$httponly);
return$sid;
}
returnnull;
}
privatestaticfunctioncreate_session_id()
{
$sid=self::get_session_id();
if(!$sid)
{
$sid=Fun::getIp().TIME.microtime(TRUE).mt_rand(mt_rand(0,100),mt_rand(100000,90000000));
$sid=md5(self::$pre_key.$sid);
setcookie('WBSID',substr($sid,0,32),TIME+self::get_gc_maxtime(),self::$path,self::$domain,self::$secure,self::$httponly);
}
return$sid;
}
publicstaticfunctionget_gc_maxtime()
{
returnself::$gc_max_time;
}
}
希望本文所述对大家的php程序设计有所帮助。