Home  >  Article  >  Backend Development  >  Optimize the use of mysql storage session_PHP tutorial

Optimize the use of mysql storage session_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 17:36:28727browse

之前写过两篇文章《自定义SESSION(二)——数据库保存》和《我为什么不使用session》
  但后来发现都有问题。前者处理在实际中几乎没什么用处,而且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,
 `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 prefix

private $_time = ;//current time

private $_model = null;//Database operation model

private $_expiry = 1200;//session validity time

private $_domain = ;//session scope

protected $isNew = 0;//Determine operation action 0 Update 1 Added

protected $session = array();//Corresponding session record

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->session[uid],$value);
                                                                                                                                                              ->session[value];
             $other[$key] = $value; > public function get($key){
if(in_array($key,array(uid,username,usertype,url,expiry))){
return $this->session[$key];
                                                                                                                                                                                           
          return null; if( $lasttime + $time<$this->_time){
                                                                                                                                                                                                                                   $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->_getSes

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/508236.htmlTechArticle之前写过两篇文章《自定义SESSION(二)——数据库保存》和《我为什么不使用session》 但后来发现都有问题。前者处理在实际中几乎没什么...

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn