ホームページ php教程 php手册 mysql を使用してセッションを保存する PHP コードを最適化する

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

Jun 13, 2016 pm 12:30 PM
mysql php session コード 最適化 使用 ストレージ 記事

以前に「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); 
}
}
?> 

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQL:データベース、phpmyAdmin:管理インターフェイス MySQL:データベース、phpmyAdmin:管理インターフェイス Apr 29, 2025 am 12:44 AM

MySQLとPHPMyAdminは、次の手順を通じて効果的に管理できます。1。データベースの作成と削除:PHPMyAdminをクリックして完了します。 2。テーブルの管理:テーブルを作成し、構造を変更し、インデックスを追加できます。 3。データ操作:データの挿入、更新、削除、SQLクエリの実行をサポートします。 4。データのインポートとエクスポート:SQL、CSV、XML、およびその他の形式をサポートします。 5。最適化と監視:最適化可能なコマンドを使用してテーブルを最適化し、クエリアナライザーと監視ツールを使用してパフォーマンスの問題を解決します。

作曲家:AIを介したPHP開発の援助 作曲家:AIを介したPHP開発の援助 Apr 29, 2025 am 12:27 AM

AIは、作曲家の使用を最適化するのに役立ちます。特定の方法には次のものが含まれます。1。依存関係管理の最適化:AIは依存関係を分析し、最適なバージョンの組み合わせを推奨し、競合を減らします。 2。自動コード生成:AIは、ベストプラクティスに準拠したComposer.jsonファイルを生成します。 3.コードの品質を改善する:AIは潜在的な問題を検出し、最適化の提案を提供し、コードの品質を向上させます。これらの方法は、開発者が効率とコードの品質を向上させるのに役立つ機械学習および自然言語処理技術を通じて実装されています。

フィールドをMySQLテーブルに追加および削除する手順 フィールドをMySQLテーブルに追加および削除する手順 Apr 29, 2025 pm 04:15 PM

MySQLでは、AlterTabletable_nameaddcolumnnew_columnvarchar(255)afterexisting_columnを使用してフィールドを追加し、andtabletable_namedopcolumncolumn_to_dropを使用してフィールドを削除します。フィールドを追加するときは、クエリのパフォーマンスとデータ構造を最適化する場所を指定する必要があります。フィールドを削除する前に、操作が不可逆的であることを確認する必要があります。オンラインDDL、バックアップデータ、テスト環境、および低負荷期間を使用したテーブル構造の変更は、パフォーマンスの最適化とベストプラクティスです。

session_start()関数の重要性は何ですか? session_start()関数の重要性は何ですか? May 03, 2025 am 12:18 AM

session_start()iscrucialinphpformangingusersions.1)itInitiateSanewsessionifnoneExists、2)resumesanexistingsession、および3)SetSessionCookieforcontinuityAcrossRequests、ApplicationslicationSliviseSlikeUserauthicationAnticatent。

MySQLをアンインストールし、残留ファイルをクリーンする方法 MySQLをアンインストールし、残留ファイルをクリーンする方法 Apr 29, 2025 pm 04:03 PM

安全かつ徹底的にMySQLをアンインストールし、すべての残留ファイルをクリーンにするには、次の手順に従ってください。1。MySQLサービスを停止します。 2。MySQLパッケージをアンインストールします。 3.構成ファイルとデータディレクトリのクリーン。 4.アンインストールが徹底していることを確認します。

MySQLにデータを挿入する効率的な方法 MySQLにデータを挿入する効率的な方法 Apr 29, 2025 pm 04:18 PM

MySQLでデータを挿入するための効率的な方法には、次のものが含まれます。1。insertInto ...値構文、2。LoadDatainFileコマンドの使用、3。トランザクション処理の使用、4。バッチサイズの調整、5。Insurtignoreまたは挿入の使用...

データ処理と計算にMySQL関数を使用する方法 データ処理と計算にMySQL関数を使用する方法 Apr 29, 2025 pm 04:21 PM

MySQL関数は、データ処理と計算に使用できます。 1.基本的な使用には、文字列処理、日付計算、数学操作が含まれます。 2。高度な使用法には、複数の関数を組み合わせて複雑な操作を実装することが含まれます。 3.パフォーマンスの最適化では、Where句での機能の使用を回避し、GroupByおよび一時テーブルを使用する必要があります。

MACOSシステム上のMySQLのインストール手順の詳細な説明 MACOSシステム上のMySQLのインストール手順の詳細な説明 Apr 29, 2025 pm 03:36 PM

MASQLのインストールは、次の手順で実現できます。1。コマンド/bin/bash-c"$(curl-fsslhttps://raw.githubusercontent.com/homebrew/install/head/install.sh)を使用して、Homebrewをインストールします。 2. Homebrewを更新し、Brewupdateを使用します。 3. mysqlをインストールし、Br​​ewinstallmysqlを使用します。 4. mysqlサービスを開始し、Brewservicesstartmysqlを使用します。インストール後、MySQL-Uを使用できます

See all articles