国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

優(yōu)化使用mysql存儲(chǔ)session

2019-11-17 04:23:45
字體:
供稿:網(wǎng)友

之前寫過兩篇文章《自定義session(二)——數(shù)據(jù)庫保存》和《我為什么不使用session》
  但后來發(fā)現(xiàn)都有問題。前者處理在實(shí)際中幾乎沒什么用處,而且session回收還得自己另外處理。后者頻繁的操作數(shù)據(jù)庫,打來了很大的性能問題。

  這兩天仔細(xì)考慮下,大致給出一個(gè)方案,但還沒有具體詳細(xì)的測試。
  1、session處理和統(tǒng)計(jì)結(jié)合起來。同時(shí)游客也都有記錄。
  2、完全使用數(shù)據(jù)庫和cookie來模擬session的功能。
  3、用戶的對session的操作都盡量保證在一條sql語句完成。不用到session的時(shí)候,絕對不多一條查詢。
  4、為了效率起見,session的回收沒有集成進(jìn)來,但提供了接口,可以調(diào)用實(shí)現(xiàn)。

暫時(shí)給出代碼,不具體解釋。
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,
 `expiry` 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= '';//session的前綴
   
    private $_time = '';//當(dāng)前時(shí)間
   
    private $_model = null;//數(shù)據(jù)庫操作模型
   
    private $_expiry = 1200;//session有效時(shí)間
   
    private $_domain = '';//session的作用域
   
    protected $isNew = 0;//判定操作動(dòng)作 0 更新 1 增加
   
    protected $session = array();//對應(yīng)的一條session記錄
   
    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','expiry'))){
            if($key == 'expiry'){
                $this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$value);
                $this->_setCookie($this->_sessionPrex.'_uid',$this->session['uid'],$value);
            }
            $this->session[$key] = $value;
        }else{
            $other = $this->session['value'];
            $other[$key] = $value;
            $this->session['value'] = $other;
        }
    }
   
    public function get($key){
        if(in_array($key,array('uid','username','usertype','url','expiry'))){
            return $this->session[$key];
        }else{
            if(isset($this->session['value'][$key])){
                return $this->session['value'][$key];
            }
            return null;
        }
    }
   
    public function gc($file,$time = 1200){
        $lasttime = file_get_contents($file);
        if($lasttime + $time<$this->_time){
            file_put_contents($file,$this->_time);
            return $this->_model->delete('activetime+expiry<'.$this->_time);
        }
    }
   
    public function destroy(){
        $this->session['uid'] = 0;
        $this->session['username'] = '';
        $this->session['usertype'] = -1;
        $this->session['expiry'] = $this->_expiry;
        $this->session['value'] = array();
        $this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$this->_expiry);
        $this->_setCookie($this->_sessionPrex.'_uid',$this->session['uid'],$this->_expiry);
    }
   
    public function __destruct(){
        $this->_save();
    }
   
    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'];
            $this->_model->update(array_slice($dbSession,1),'sid=/''.$sid.'/'');
        }
    }
   
    private function _getSession($sid){
        $dbSession = $this->_model->detail('sid = /''.$sid.'/'');
        if(!$dbSession)return false;
        $dbSession['value'] = unserialize($dbSession['value']);
        $this->session = array_merge($dbSession,$this->session);       
        return true;
    }
   
    private function _getSid(){
        $sid = strip_tags($_COOKIE[$this->_sessionPrex.'_sid']);
        if(strlen($sid)==32){
            if($this->_getSession($sid)){
                return true;
            }
        }else{
            $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']),
                'expiry' =>$this->_expiry,
                'value' => array()
        );
        $this->isNew = 1;
        $this->session['sid'] = $sid;
    }
   
    private function _setCookie($name,$value,$expiry=0){
        if(empty($expiry))$expiry = $this->_expiry;
        if(empty($this->_domain)){
            setcookie($name,$value,$this->_time + $expiry,'/');
        }else{
            setcookie($name,$value,$this->_time + $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);
    }
}
?>


(注意,該代碼不能直接使用,本文主要是提供一種思路)


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 哈密市| 札达县| 宽甸| 怀化市| 岳池县| 合山市| 磐安县| 抚顺县| 汝城县| 营山县| 房山区| 上高县| 浮梁县| 南城县| 牙克石市| 噶尔县| 安平县| 鹤岗市| 北京市| 金昌市| 扶沟县| 神池县| 军事| 垦利县| 凉城县| 九龙县| 柳林县| 赤壁市| 江达县| 迁安市| 宿松县| 鱼台县| 西城区| 聂荣县| 弥勒县| 泗水县| 永川市| 洱源县| 城步| 麟游县| 安陆市|