优化使用mysql存储session

这两天仔细考虑下,大致给出一个方案,但还没有具体详细的测试。
  1、session处理和统计结合起来。同时游客也都有记录。
  2、完全使用数据库和cookie来模拟session的功能。
  3、用户的对session的操作都尽量保证在一条sql语句完成。不用到session的时候,绝对不多一条查询。
  4、为了效率起见,session的回收没有集成进来,推荐另外写程序调用。

暂时给出代码,不具体解释。
sql


CREATE TABLE `*****_session` (
 `sid` char(32) NOT NULL,
 `uid` int(10) NOT NULL,
 `username` char(32) NOT NULL,
 `usertype` tinyint(1) NOT NULL,
 `activetime` int(10) NOT NULL,
 `ip` char(15) NOT NULL,
 `url` char(80) NOT NULL,
 `value` char(255) NOT NULL,
 PRIMARY KEY  (`sid`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;



php代码



<?

class session{

    

    private 
$_sessionPrex'';

    

    private 
$_time '';

    

    private 
$_model null;

    

    private 
$_expiry 3600;

    

    private 
$_domain '';

    

    protected 
$isNew 0;//0 更新 1 增加

    

    
protected $isGetSession 0;//0还没有取出session 1 已经取出了

    

    
protected $session = array();

    

    public function 
__construct($options){

        
$this->_setOptions($options);

        if(empty(
$this->_time))$this->_time time();

        
$this->session['activetime'] = $this->_time;

    }

    

    public function 
start(){

        
$this->_getSid();

    }

    

    public function 
set($key,$value){

        if(
in_array($key,array('uid','username','usertype','url'))){

            
$this->session[$key] = $value;

        }else{

            
$other $this->session['value'];

            
$other[$key] = $value;

            
$this->session['value'] = $other;

        }

    }

    

    public function 
get($key){

        if(
$this->isGetSession == 0){

            
//从数据库读取session记录

            
$this->_getSession();

            
$this->isGetSession 1;

        }

        if(
in_array($key,array('uid','username','usertype','url'))){

            return 
$this->session[$key];

        }else{

            if(isset(
$this->session['value'][$key])){

                return 
$this->session['value'][$key];

            }

            return 
null;

        }

    }

    

    public function 
destroy(){

        
$this->session['uid'] = 0;

        
$this->session['username'] = '';

        
$this->session['usertype'] = '';

        
$this->session['value'] = array();

    }

    

    public function 
__destruct(){

        
$this->_save();

        echo 
'<br>'.$this->_model->getDb()->getQNum();

    }

    

    private function 
_save(){

        
$dbSession $this->session;

        
$dbSession['value'] = serialize($dbSession['value']);

        if(
strlen($dbSession['value'])>255)$this->_error('session->value is too long!');

        if(
$this->isNew == 1){

            
//增加

            
$this->_model->insert($dbSession);

        }else{

            
//更新

            
$sid $dbSession['sid'];

            unset(
$dbSession['sid']);

            
$this->_model->update($dbSession,'sid=/''.$sid.'/'');

        }

    }

    

    private function 
_getSession(){

        
$dbSession $this->_model->detail('sid = /''.$this->session['sid'].'/'');

        
$dbSession['value'] = unserialize($dbSession['value']);

        
$this->session array_merge($dbSession,$this->session);

    }

    

    private function 
_getSid(){

        
$sid strip_tags($_COOKIE[$this->_sessionPrex.'_sid']);

        if (
strlen($sid)!=32) {

            
//new

            
$sid md5(time().mt_rand(1000,10000));

            
$this->_setCookie($this->_sessionPrex.'_sid',$sid);

            
$this->_setCookie($this->_sessionPrex.'_uid',0);

            
$this->session = array(

                
'uid' => 0,

                
'username' => '',

                
'usertype' => -1,

                
'activetime' => $this->_time,

                
'ip' => $this->_getip(),

                
'url' => strip_tags($_SERVER['REQUEST_URI']),

                
'value' => array()

            );

            
$this->isNew 1;

        }

        
$this->session['sid'] = $sid;

    }

    

    private function 
_setCookie($name,$value){

        if(empty(
$this->_domain)){

            
setcookie($name,$value,$this->_time $this->_expiry,'/');

        }else{

            
setcookie($name,$value,$this->_time $this->_expiry,'/',$this->_domain);

        }

    }

    

    private function 
_getip(){

        return 
getip();

    }

    

    private function 
_setOptions($options){

        foreach (
$options as $key=>$value){

            if(
in_array($key,array('sessionPrex','time','model','expiry','domain'))){

                
$key '_'.$key;

                
$this->$key $value;

            }

        }

    }

    

    private function 
_error($msg){

        throw new 
Phpbean_Exception($msg);

    }

}

?>

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值