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代码:
<?php /*打开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();
友情提示:垃圾评论一律封号...