现在的位置: 首页 > 综合 > 正文

优化使用mysql存储session

2013年11月23日 ⁄ 综合 ⁄ 共 4274字 ⁄ 字号 评论关闭
这两天仔细考虑下,大致给出一个方案,但还没有具体详细的测试。
  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);

    }

}

?>

 

抱歉!评论已关闭.