session有可能因为文件的数量过多,会在查询session文件以及读取的时候产生压力。可以使用session分层来减少查询的压力,但是该方法并没有真正的解决I/O瓶颈问题。将session存入数据库可以实现多站点共享session,控制一个帐号只能一个人登录等功能。
session存放到数据库,一般我们是将session存放到内存(非关系型数据库)。
本例以存到mysql数据库为示例:
数据库结构:CREATE TABLE `session` (
`sess_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`sess_info` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`sess_expire` int(11) NOT NULL ,
PRIMARY KEY (`sess_id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ciphp代码:
/*打开session*/
function sess_open(){
mysql_connect('127.0.0.1','root','root');
mysql_query("use putsession");
}
/*关闭session*/
function sess_close(){
mysql_close();
}
/*读取session*/
function sess_read($sess_id){
/*根据sess_id查询数据库,获取session信息,过滤过期的数据*/
$expire=time()-ini_get('session.gc_maxlifetime');
$sql="SELECT * FROM session WHERE sess_id='{$sess_id}' AND sess_expire >= {$expire}";
$res=mysql_query($sql);
if($res){
$sess=mysql_fetch_assoc($res);
return $sess['sess_info'];
}
}
/*写入session*/
function sess_write($sess_id,$sess_info){
$time=time();
$sql="REPLACE INTO session VALUES('{$sess_id}','{$sess_info}','{$time}')";
return mysql_query($sql);
}
/*销毁session*/
function sess_destory($sess_id){
$sql="DELETE FROM session WHERE sess_id='{$sess_id}'";
return mysql_query($sql);
}
/*释放资源,垃圾回收*/
function sess_gc(){
/*判断session是否过期,过期删除*/
$expire=time()-ini_get('session.gc_maxlifetime');//最迟的时间,此时间之前的会删除
$sql="DELETE FROM session WHERE sess_expire < $expire";
return mysql_query($sql);
}
/*session入库函数*/
//bool session_set_save_handler (开启session机制函数 ,关闭session机制函数, 读取session数据函数 ,
//写入session函数 , 销毁session函数, 回收过期session函数 )
session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destory','sess_gc');
/*开启session*/
session_start();
$_SESSION['name']='dogs';
$_SESSION['age']=34;
var_dump($_SESSION);
/*销毁session*/
session_destroy();