mysql を使用してセッションを保存する PHP コードを最適化する

WBOY
リリース: 2016-06-13 12:30:55
オリジナル
799 人が閲覧しました

以前に「SESSION のカスタマイズ (2) - データベースの保存」と「Session を使用しない理由」の 2 つの記事を書きました
しかし、後で両方とも問題があることに気づきました。前者の処理は実際にはほとんど役に立たず、セッションのリサイクルは個別に処理する必要があります。後者はデータベースを頻繁に操作するため、パフォーマンスに大きな問題が発生します。

この2日間で熟考した結果、大まかな計画は提示しましたが、具体的で詳細なテストはありません。
1. セッション処理と統計を結合します。訪問者も記録されます。
2. データベースと Cookie を完全に使用して、セッション機能をシミュレートします。
3. セッションに対するユーザーの操作は、できる限り 1 つの SQL ステートメントで完了する必要があります。セッションが必要ない場合、クエリは 1 つだけです。
4. 効率化のため、セッションのリサイクルは統合されていませんが、インターフェイスが提供されており、それを実装するために呼び出すことができます。

詳しい説明は省略し、暫定的にコードを記載しています。
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、
主キー ( `sid`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;




php コード


private $_sessionPrex= '';//セッションプレフィックス

private $_time = '';//現在時刻

private $_model = null;//データベース操作モデル

private $_expiry = 1200;//セッション有効期間

private $_domain = '';//セッション スコープ

protected $isNew = 0;// 操作アクションを決定0 更新 1 追加

protected $session = array();//対応するセッション レコード

public function __construct($options){
$this-> _setOptions($options); ;
If(empty($this->_time))$this->_time = time();
$this->session['activetime'] = $this->_time 値; ){
if(in_array($key,array('uid','username','usertype','url','expiry'))){
if($key == 'expiry' ) {
$this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$value); - > _sessionprex .'_ uid '、$ this-> session、$ value); 🎜> $other[$key] = $value;
$this->session['value'] = $ other;
} }
}

パブリック関数 get($ key){
',' 有効期限 '))))) {
Return $ this-& gt;
} else {
if (ISSET ($ this- & gt; session [' value '] [$ key])){
return $this->session['value'][$key];
return
} } 

public 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 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 が長すぎます!'); 
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);         
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' => '',
'ユーザータイプ' => -1,
'activetime' =>_time,
'ip' => $this->_getip(),
'url' =>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); 
}
}
?> 

(注意、この代価は直接使用できません、ここでは主に一思路を提供します) 

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート