这个系列会写三篇,1:存入数据库,2:存入多级目录,3:存入内存(redis或者memchced)
今天讲存入数据库:
session机制在这里我就不讲了,网上有很多
1:session存入数据库需要吧save_handler改成user,两种方式修改
(1):配置文件修改,在php.ini里找到session.save_handler,默认是files,改成user,session.save_handler=user
(2):在代码里配置,session_module_name('user');
2:在session_start()之前设置session_set_save_handler,这个函数php官网上说的很清楚,里边有几个回调函数,ji就需要在类里设置几个函数,这里主要说下gc函数,就是清楚过期的session,这个gc函数是有这两个参数的比值决定的:gc_probability/gc_divisor,gc_probability默认是1,gc_divisor默认是1000,表示1000个请求才会清理过期的 session,如果想快点清楚过期session,可以吧gc_divisor调小点,不过对应的性能消耗也会增加,所以看自己了
下边直接贴代码:
<?php define('MY_SESS_TIME',10); //SESSION 超时时间 class sessdb { static public $db;//数据库连接对象 function __construct($dbname) { self::$db = $dbname; } function init() { $domain = 'localhost'; //cookie 域名设置 ini_set('session.use_trans_sid',0);//如果浏览器被禁止了使用cookie,这里设置为1后将会在url地址栏后面自动加上sessionid传递 ini_set('session.gc_maxlifetime',MY_SESS_TIME);//这个是Session数据在服务器端储存的时间 ini_set('session.use_cookies',1); //sessionid的传递方式,默认是cookie,推荐使用 ini_set('session.cookie_path','/'); //sessionid的cookie路径,不需要修改 ini_set('session.cookie_domain',$domain);// ;sessionid的cookie域名 session_module_name('user'); session_set_save_handler( array('sessdb','open'), array('sessdb','close'), array('sessdb','read'), array('sessdb','write'), array('sessdb','destroy'), array('sessdb','gc') ); session_start(); } function open($save_path,$session_name) { return true; } function close() { return true; } function read($sesskey) //读取到对应于 SESSION ID 的 SESSION 数据 { $sql = "SELECT `data` FROM `sess` WHERE `sesskey`='$sesskey' AND `expiry`>=" . time(); $res = self::$db->mysqlfetch($sql); if(!empty($res)){ return $res[0]['data']; }else{ return ''; } } function write($sesskey,$data) { $expiry = time()+MY_SESS_TIME; if(!empty($data)){ $sql = "insert INTO `sess` (`sesskey`,`expiry`,`data`) VALUES ('$sesskey',$expiry,'$data')"; self::$db->mysqlquery($sql); return true; }else{ return false; } } function destroy($sesskey) { $sql = "DELETE FROM `sess` WHERE `sesskey`='$sesskey'"; self::$db->mysqlquery($sql); return true; } function gc($maxlifetime = null) { $sql = 'DELETE FROM `sess` WHERE `expiry`<'.time(); self::$db->mysqlquery($sql); return true; } } require_once('../init.php'); $db2 = new DB(); $sess = new sessdb($db2); $sess->init();
//init.php方法是我自己写的操作数据库,网友可以自己写过
使用的话,只需要这样就可以存入数据库:
$_SESSION['a']='aaab'; $_SESSION['b']='bbb'; $_SESSION['c']='ccc'; $_SESSION['d']=array('111'=>111,'2222'=>'2222');
大家有什么问题可以留言
