将PHP的session数据存储到数据库中的代码实例
一个开发环境有多个网站,需要使用不同的session,解决方案很多。不过这次也高大上一把,用数据库存,方便以后扩展。
PostgreSQL版
首先是数据库的部分
--droptablephp_session createunloggedtablephp_session ( sess_idvarchar(32)primarykey, modify_timetimestampwithtimezonenotnull, sess_datavarchar(3000)default'' ); createindexconcurrentlyidx_php_session_modify_timeonphp_session(modify_time); --set_session(id,data) createorreplacefunctionset_session(varchar,varchar)returnsvoidas$set_session$ withupsertas( updatephp_session setmodify_time=current_timestamp,sess_data=$2 wheresess_id=$1 returning1 ) insertintophp_session(sess_id,modify_time,sess_data) select$1,current_timestamp,$2 wherenotexists( select1fromupsert ); $set_session$languagesql; --get_session(id) createorreplacefunctionget_session(varchar)returnsvarcharas$get_session$ selectsess_datafromphp_sessionwheresess_id=$1 $get_session$languagesql; --del_session createorreplacefunctiondel_session(varchar)returnsvoidas$del_session$ deletefromphp_sessionwheresess_id=$1 $del_session$languagesql; --gc_session createorreplacefunctiongc_session()returnsvoidas$del_session$ deletefromphp_sessionwheremodify_time<current_timestamp-interval'30days' $del_session$languagesql;
然后是PHP的部分
<?php
session_set_save_handler(
function($savePath,$sessionName){//open
returntrue;
},
function(){//close
returntrue;
},
function($id){//read
$sql="selectget_session($1)";
$stmt=pg_query_params(SESSION_CONN,$sql,array($id));
$result=pg_fetch_row($stmt);
return$result[0];
},
function($id,$data){//write
$sql="selectset_session($1,$2)";
pg_query_params(SESSION_CONN,$sql,array($id,$data));
returntrue;
},
function($id){//destroy
$sql="selectdel_session($1)";
pg_query_params(SESSION_CONN,$sql,array($id,$data));
returntrue;
},
function($maxlifetime){//gc
//phpneedn'tcontroltheglobalsessiongc
returntrue;
}
);
register_shutdown_function('session_write_close');
?>
然后只要在session_start之前调用这个就可以了
至于SESSION_CONN,那是我定义的一个常量,表示一个指向session数据库的链接而已。
MySQL版
再总结一个针对MySQL的集成更多基础功能的例子:
表结构:
CREATETABLEIFNOTEXISTS`sessioninfo`( `sid`varchar(255)NOTNULL, `value`textNOTNULL, `expiration`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, PRIMARYKEY(`sid`) )ENGINE=InnoDBDEFAULTCHARSET=utf8;
session信息存储到数据库的类:
classMySessionHandlerimplementsSessionHandlerInterface{
/**
*@accessprivate
*@varobject数据库连接
*/
private$_dbLink;
/**
*@accessprivate
*@varstring保存session的表名
*/
Private$_sessionTable;
/**
*@accessprivate
*@varstringsession名
*/
private$_sessionName;
/**
*@const过期时间
*/
constSESSION_EXPIRE=10;
publicfunction__construct($dbLink,$sessionTable){
if(!is_object($dbLink)){
returnfalse;
}
$this->_dbLink=$dbLink;
$this->_sessionTable=$sessionTable;
}
/**
*打开
*@accesspublic
*@paramstring$session_save_path保存session的路径
*@paramstring$session_namesession名
*@returninteger
*/
publicfunctionopen($session_save_path,$session_name){
$this->_sessionName=$session_name;
return0;
}
/**
*关闭
*@accesspublic
*@returninteger
*/
publicfunctionclose(){
return0;
}
/**
*关闭session
*@accesspublic
*@paramstring$session_idsessionID
*@returnstring
*/
publicfunctionread($session_id){
$query="SELECTvalueFROM{$this->_sessionTable}WHEREsid={$session_id}ANDUNIX_TIMESTAMP(expiration)+".self::SESSION_EXPIRE.">UNIX_TIMESTAMP(NOW())";
$result=$this->_dbLink->query($query);
if(!isset($value)||empty($value)){
$value="";
return$value;
}
$this->_dbLink->query("UPDATE{$this->_sessionTable}SETexpiration=CURRENT_TIMESTAMP()WHEREsid={$session_id}");
$value=$result->fetch_array();
$result->free();
return$value['value'];
}
/**
*写入session
*@accesspublic
*@paramstring$session_idsessionID
*@paramstring$session_datasessiondata
*@returninteger
*/
publicfunctionwrite($session_id,$session_data){
$query="SELECTvalueFROM{$this->_sessionTable}WHEREsid='{$session_id}'ANDUNIX_TIMESTAMP(expiration)+".self::SESSION_EXPIRE.">UNIX_TIMESTAMP(NOW())";
$result=$this->_dbLink->query($query);
$result=$result->fetch_array();
if(!empty($result)){
$result=$this->_dbLink->query("UPDATE{$this->_sessionTable}SETvalue={$session_data}WHEREsid={$session_id}");
}
else{
$result=$this->_dbLink->query("INSERTINTO{$this->_sessionTable}(sid,value)VALUES('{$session_id}','{$session_data}')");
}
if($result){
return0;
}
else{
return1;
}
}
/**
*销魂session
*@accesspublic
*@paramstring$session_idsessionID
*@returninteger
*/
publicfunctiondestroy($session_id){
$result=$this->_dbLink->query("DELETEFROM{$this->_sessionTable}WHEREsid='{$session_id}'");
if($result){
return0;
}
else{
return1;
}
}
/**
*垃圾回收
*@accesspublic
*@paramstring$maxlifetimesession最长生存时间
*@returninteger
*/
publicfunctiongc($maxlifetime){
$result=$this->_dbLink->query("DELETEFROM{$this->_sessionTable}WHEREUNIX_TIMESTAMP(expiration)<UNIX_TIMESTAMP(NOW())-".self::SESSION_EXPIRE);
if($result){
return0;
}
else{
return1;
}
}
}
$dbLink=newmysqli("localhost","root","root","test");
$sessionTable="sessioninfo";
$handler=newMySessionHandler($dbLink,$sessionTable);
session_set_save_handler($handler);
session_start();
$_SESSION['name']="test";
echo$_SESSION["name"];
//session_destroy();