ホームページ バックエンド開発 PHPチュートリアル discuz セッションメカニズム_PHP チュートリアル

discuz セッションメカニズム_PHP チュートリアル

Jul 13, 2016 pm 05:45 PM
discuz php session コード 存在する 機構 説明する

PHPコード
DiscuzのSESSIONの仕組みを解説!
いつものようにディスカスで!

データベース内に 2 つの SESSION テーブルがあることがわかります:
1 つは pre_common_adminsession で、管理者がバックグラウンドでログインするための SESSION テーブルです。 もう 1 つは pre_common_session テーブルで、すべてのユーザーがフォアグラウンドでページを参照するときの SESSION テーブルです。
どちらのテーブルもメモリ テーブルです (メモリ テーブルの読み取りおよび書き込み速度は、MYISAM テーブルやテキスト ファイルの速度よりもはるかに高速です)。

ディスカスで! その後、ページの閲覧時に関連関数の実行がトリガーされ、データベースの SESSION テーブルに書き込まれます。

ログイン処理を例にプログラムの実行方法を説明します。
フロントのホームページで「ログイン」をクリックするとログイン画面が表示されますので、必要事項を入力の上、送信してください。フォーム送信用の URL は次のとおりです:

1 http://ux.com/member.php?mod=logging&action=login&loginsubmit =はい&floatlogin=はい&inajax=1
データは member.php ファイルに送信され、プログラム内に次のコードが表示されます:
01 $mod = !in_array($discuz->var['mod'], $modarray) ? 'logging' : $discuz->var['mod']; //mod の値は次にロードされるものですPHPページ
02 定義('CURMODULE', $mod); 03 $modcachelist = array('register' => array('modreasons', 'stamptypeid', 'fields_required', 'fields_optional', 'ipctrl')); 04 $cachelist = 配列(); 05 if(isset($modcachelist[CURMODULE])) {
06 $cachelist = $modcachelist[CURMODULE]
07 }
08 $discuz->キャッシュリスト = $キャッシュリスト
09 $discuz->init(); ランフック 10 個()
; 11 require DISCUZ_ROOT.'./source/module/member/member_'.$mod.'.php' //プログラムの組み込み操作を完了します
;
source/module/member/member_logging.php ファイルを開くと、クラスの前に次の 3 行のコードが表示されます。

$ctl_obj = 新しいロギング_ctl(); $method = 'on_'.$_G['gp_action']; // $_G['gp_action'] は、アクションの値、つまりログインと同じです
$ctl_obj->$method(); //$ctl_obj->on_login();
ログイン メソッドは、メソッドの 56 行目あたりに次の判定ステートメントがあります。

if(!submitcheck('loginsubmit', 1, $seccodecheck)) {

判定ステートメントは、訪問者が閲覧した場合、submitcheck 関数の戻り値は false であり、それを反転すると true になります。
ユーザーがログインすると、プログラムは else 部分を通過し、次の 5 行のコードが表示されます。

} その他 {
$_G['uid'] = $_G['member']['uid'] = 0; $_G['username'] = $_G['member']['username'] = $_G['member']['password'] = ''; $result = userlogin($_G['gp_username'], $_G['gp_password'], $_G['gp_questionid'], $_G['gp_answer'], $_G['setting']['autoidselect'] ? 'auto' : $_G['gp_loginfield']); // データベースからユーザー データをクエリし、対応する情報を返します

If($result['status'] > 0) { //ステータス値は 0 より大きく、このユーザーはログインできることを示します
setloginstatus($result['member'], $_G['gp_cookietime'] ? 2592000 : 0); //ログインステータスの設定、つまり COOKIE のデータは SESSION の対応するデータですが、この関数はSESSIONの書き込み操作については責任を負いません

source/function/function_login.php の setloginstatus 関数を見てみましょう。これは通常の COOKIE 書き込み操作であるため、詳細は説明しません。

関数 setloginstatus($member, $cookietime) {
グローバル $_G; $_G['uid'] = $member['uid']
$_G['ユーザー名'] = $メンバー['ユーザー名']; $_G['管理者'] = $メンバー['管理者']
$_G['グループID'] = $メンバー['グループID']
$_G['フォームハッシュ'] = フォームハッシュ(); $_G['セッション']['invisible'] = getuserprofile('invisible'); $_G['メンバー'] = $メンバー
; $_G['コア']->セッション->新しい = 1;
dsetcookie('auth', authcode("{$member['password']}t{$member['uid']}", 'ENCODE'), $cookietime, 1, true); //認証コード暗号化
dsetcookie('ログインユーザー'); dsetcookie('アクティベーション認証'); dsetcookie('pmnum'); }

この時点でログイン処理はほぼ完了していると言えますが、COOKIEをクリアしないとクライアント上に常に存在し、タイムアウトになった場合、プログラムはこのCOOKIEを破棄して書き換えると判断します。

DZX のsource/class/calss_core.php ファイルにある SESSION 操作のクラスを見てみましょう:
プログラム内の各リクエストは SESSION をロードします。これはコア クラス discuz_core の _init_session メソッドによって実行されます。このメソッドはクラスの init メソッドに配置され、クラスがロードされるたびに SESSION が自動的に書き込まれることを示します。


関数 _init_session() {

$this->session = new discuz_session() //SESSION クラスを作成します
;
If($this->init_session) {
//COOKIE からデータを読み取ります
$this->session->init($this->var['cookie']['sid'], $this->var['clientip'], $this->var['uid' ]); $this->var['sid'] = $this->session->sid; $this->var['session'] = $this->session->var; // SID が等しいかどうかを判断し、複数のユーザーが同じホスト上の Web サイトにログインしており、COOKIE を書き換える必要があることを示します
If($this->var['sid'] != $this->var['cookie']['sid']) {
dsetcookie('sid', $this->var['sid'], 86400); }

If($this->セッション->isnew) {
If(ipbanned($this->var['clientip'])) {
$ This-> session-> set ('groupid', 6);                                                                          }

If($this->session->get('groupid') == 6) {
$this->var['member']['groupid'] = 6; sysmessage('user_banned'); }
//UID が空ではなく、SESSION を更新する必要があるか、SESSION がタイムアウトになり、ユーザーのステータスが変更され、ユーザーは再度ログインする必要があります
if($this->var['uid'] && ($this->session->isnew || ($this->session->get('lastactivity') + 600)
$this->session->set('lastactivity', TIMESTAMP);
$update = array('lastip' => $this->var['clientip'], 'lastactivity' => TIMESTAMP);If($this->セッション->isnew) {
$update['lastvisit'] = タイムスタンプ;                                                                        DB::update('common_member_status', $update, "uid='".$this->var['uid']."'"); }

}
}

SESSION を操作するクラスは discuz_session です。このクラスの 2 つのメソッドを見てみましょう:


//この関数は新しいセッションの生成を担当しますが、データベースへの書き込みは担当しません
関数 create($ip, $uid) {
//SESSION を作成し、データ挿入を実行し、ランダム関数によって 6 桁の乱数を生成します。これはセッションの一意の値です。時刻は現在時刻、sid は Cookie 内の sid です。 $this->isnew = true; $this->var = $this->newguest; $this->set('sid', random(6)); $this->set('uid', $uid); $this->set('ip', $ip); $this->set('lastactivity', time()); $this->sid = $this->var['sid'];
$this->var を返す
}
//この関数は SESSION の更新を担当します
関数 update() {
If($this->sid !== null) {

$data = daddslashes($this->var);
If($this->isnew) {
$this->削除(); DB::insert('common_session', $data, false, false, true);                                                                                            DB::update('common_session', $data, "sid='$data[sid]'");                                                                        dsetcookie('sid', $this->sid, 86400); }
}

これまでのところ、SESSION をデータベースに挿入する具体的な機能と COOKIE との接続はわかっていますが、この操作がどのようにトリガーされるかは明らかではありません。
source/function/function_core.php ファイルを開き、関数 updatesession を見つけます。この関数はセッションを更新します:


関数更新セッション($force = false) {

グローバル $_G; 静的 $updated = false
; If(!$updated) {
$discuz = & discuz_core::instance(); foreach($discuz->session->var as $k =>$v) {
If(isset($_G['member'][$k]) && $k != 'lastactivity') {
$discuz->session->set($k, $_G['member'][$k]);                                                                        }

foreach($_G['action'] as $k => $v) {
$discuz->session->set($k, $v); }

$discuz->session->update();
$updated = true; }
$更新
を返します。 }

プログラムのソース コードでこの関数を検索すると、次のコードが多くのテンプレートで見つかったことがわかります:


{eval updatesession();}

この関数は、ページが参照され、SESSION がデータベースに書き込まれるときにトリガーされます。

考えを整理します:
ステップ 1: ユーザーがログインし、プログラムが COOKIE をクライアントに書き込みます。これらの COOKIE は、SID、IP、TIME などの SESSION データの一部であり、ユーザー名やパスワードなどの重要な情報は含まれません。
2 番目のステップでは、ログインに成功すると、プログラムは自動的にページを更新し、別のリクエストをサーバーに送信します。サーバーは discuz_core コア クラスをロードし、COOKIE から SESSION 関連の情報を読み取りますが、まだデータベースには書き込まれていません。 。
3 番目のステップでは、コア クラスのロードが完了し、プログラムが実行を継続し、最後にテンプレートがロードされ、updatesession 関数がトリガーされ、SESSION がデータベースに書き込まれます。

著者「pz9042」


http://www.bkjia.com/PHPjc/478664.html

tru​​ehttp://www.bkjia.com/PHPjc/478664.html技術記事 DiscuzのSESSIONの仕組みを解説! データ内で...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

See all articles