mysqlメモリセッションを最適化するためのphpコード


前に2つの文章を書きました。「カスタムSESSION(二)データベース保存」と「なぜ私はsessionを使わないのですか?」  しかし、その後は問題があった。前者の処理は実際にはほとんど役に立ちません。そしてsessionの回収は自分で別途処理しなければなりません。後者は頻繁にデータベースを操作しています。  この二日間はよく考えて、大体の案を示しますが、まだ具体的なテストがありません。  1、session処理と統計が結合される。観光客も記録を持っています。  2、完全にデータベースとクッキーを使ってセッションの機能を模擬します。  3、ユーザーのsessionに対する操作はできるだけsql文で完成することを保証します。sessionに来ない時は、絶対に多くの検索ができません。  4、効率のために、sessionの回収は統合されていませんが、インターフェースを提供しています。実現を呼び出すことができます。コードを一時的に与え、具体的に説明しない。sql CREATE TABLE `*****_セッション` (  `sid` char(32) NOT NULL `uid` int(10) NOT NULL `username` char(32) NOT NULL `アメリカタイプ ting int(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=utf 8phpコード<  クラス セッション{      prvate $_session Prex= '';//セッションのプレフィックス      prvate $_時間 = '';//現在の時刻      prvate $_モデル = null;//データベース操作モデル      prvate $_expiry = 1200;セッション有効時間      prvate $_domain = '';//セッションのスコープ      protected $isNew = 0;//判定動作 0 更新 1 増加      protected $セッション = array()///対応する一つのセッション記録      public 機能 __construct($options){          $this->_setOptions($options);          if(empty($this->_time)$this->_時間 = time()          $this->session['activetime'] = $this->_タイム      }      public 機能 start(){          $this->_get Sid()      }      public 機能 set($key、$value){          if(in_array($key,array('uid'、'username'、'usertype'、'url'、'expiry'))              if($key) == 'expiry{                  $this->_set Cookie($this->_session Prex.'_sid'、$this->session['sid'、$value];                  $this->_set Cookie($this->_session Prex.'_uid'、$this->session['uid'、$value];              }              $this->session[$key] = $value;          }else{              $other = $this->session['value']              $other[$key] = $value;              $this->session['value'] = $other;          }      }      public 機能 get($key){          if(in_array($key,array('uid'、'username'、'usertype'、'url'、'expiry'))              return $this->session[$key];          }else{              if($this->session['value'][$key])                  return $this->session['value'][$key];              }              return null          }      }      public 機能 gc($file、$time) = 1200){          $lasttime = file_ゲットするcontensts($file)          if($lasttime) + $time<$this->_time{タイム}              file_put.contensts($file、$this->_タイム              return $this->_model->delete('activetime+expiry'.this->_タイム          }      }      public 機能 destroy(){          $this->session['uid'] = 0;          $this->session['username]] = '';          $this->session['usertype] = -1;          $this->session['expiry] = $this->_expiry          $this->session['value'] = array();          $this->_set Cookie($this->_session Prex.'_sid'、$this->session['sid]、$this->_expiry;          $this->_set Cookie($this->_session Prex.'_uid'は、$this->session['uid']、$this->_expiry;      }      public 機能 __destruct(){          $this->_セーブ();      }      prvate 機能 _save(){          $dbSession = $this->session          $dbSession['value'] = serialize($dbSession['value]);          if(streen($db Session['value]]>>255)$this->_error('session->value is too long          if($this->isNew == 1){              //増加              $this->_model->insert($dbSession);          }else{              //更新              $sid = $db Session['sid']              $this->_model->udate(array_)slice($dbSession,1)、'sid=\'.'sid.');          }      }      prvate 機能 _get Session($sid){          $dbSession = $this->_model->detail('sid) = \''.$sid.'''')          if(dbSession)return false;          $dbSession['value'] = unserialize($dbSession['value]);          $this->セッション = アラリmerge($dbSession、$this->session);                  return true;      }      prvate 機能 _get Sid(){          $sid = ストリップtags($u)COOKIE[$this->_session Prex.'_sid')          if(streen($sid)==32){              if($this->_get Session($sid){                  return true;              }          }else{              $sid = md 5(time().mt_ランド(1000,10000))              $this->_set Cookie($this->_session Prex.'_sid'、$sid);          }          $this->_set Cookie($this->_session Prex.'_uid',0);          $this->セッション = array(                  'uid => 0,                  'username => '',                  'アメリカtype => -1,                  'activetime => $this->_タイム、                  'ip => $this->_getip()                  'url => ストリップtags($u)SERVER['REQUEST_URI')                  'expiry =>$this->_expiry、                  'value => array()          );          $this->isNew = 1;          $this->session['sid'] = $sid;      }      prvate 機能 _set Cookie($name、$value、$expiry=0){          if(expiry)$expiry = $this->_expiry          if(empty($this->_domain){              set cookie($name、$value、$this-)_時間 + $expiry、'/')          }else{              set cookie($name、$value、$this-)_時間 + $expiry、'/'、$this->_domain);          }      }      prvate 機能 _getip(){          return getip()      }      prvate 機能 _setOptions($options){          foreach ($options as $key=>$value){              if(in_array($key,array('sessionPrex','time','model','expiry','domain')                  $key = '_'.$key;                  $this->>key = $value;              }          }      }      prvate 機能 _error($msg){          throw new Ppbean_Exception($msg)      }  }  ?>  (このコードは直接使用できません。本論文では主にアイデアを提供します。