discuz セッションメカニズム_PHP チュートリアル
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

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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