将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();