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) } } ?> (このコードは直接使用できません。本論文では主にアイデアを提供します。