「セッションロック (Dev docs)」の版間の差分
Mitsuhiro Yoshida (トーク | 投稿記録) 編集の要約なし |
Mitsuhiro Yoshida (トーク | 投稿記録) (done.) |
||
1行目: | 1行目: | ||
あなたが通常のmoodleページを作成してconfig.phpをインクルードした場合、デフォルトで大量のmoodleブートストラップが実行された後、$SESSIONグローバルが設定されます。 | あなたが通常のmoodleページを作成してconfig.phpをインクルードした場合、デフォルトで大量のmoodleブートストラップが実行された後、$SESSIONグローバルが設定されます。 | ||
これは安全な出発点ですが、より高性能なコードを書きたい場合、可能な限り、セッションロックを減らすか排除した方が良いでしょう。 | これは安全な出発点ですが、より高性能なコードを書きたい場合、可能な限り、セッションロックを減らすか排除した方が良いでしょう。 | ||
9行目: | 7行目: | ||
セッションがN秒以上ロックされた場合、ロックを保持している他のページの詳細に関してデバッグコールが実行されます。 | セッションがN秒以上ロックされた場合、ロックを保持している他のページの詳細に関してデバッグコールが実行されます。 | ||
== セッションロック解除 == | == セッションロック解除 == | ||
デフォルトではcoreは$SESSIONオブジェクトを変異させる必要があるかもしれないと想定されているため、ページが終了してシャットダウンハンドラがセッションロックを解放するまでセッションロックを保持することになります。 | デフォルトではcoreは$SESSIONオブジェクトを変異させる必要があるかもしれないと想定されているため、ページが終了してシャットダウンハンドラがセッションロックを解放するまでセッションロックを保持することになります。 | ||
もし、あなたが長時間実行される可能性のあるページで作業している場合、セッションを変異させる可能性のある早期に実行されるロジックと長時間実行されるprocessinコードとを明確に分離してセッションロックを解除する必要があります。 | |||
\core\session\manager::write_close(); | \core\session\manager::write_close(); | ||
== ページ内のリードオンリーセッション == | == ページ内のリードオンリーセッション == | ||
この機能を使用するにはREADONLYセッションが有効にされている必要があり、同時にそれをサポートするコードも必要です。これはすべてのセッションではありません。 | |||
もし、あなたがセッションを決して変更せず、それでも読めるようにする必要があると事前にわかっている場合、ページを読み取り専用を宣言できます。これはページが他のhttpリクエストでセッションをブロックしないことを意味します。 | |||
define('READ_ONLY_SESSION', true); | define('READ_ONLY_SESSION', true); | ||
== ウェブサービスの読み取り専用セッション == | == ウェブサービスの読み取り専用セッション == |
2023年6月4日 (日) 15:01時点における最新版
あなたが通常のmoodleページを作成してconfig.phpをインクルードした場合、デフォルトで大量のmoodleブートストラップが実行された後、$SESSIONグローバルが設定されます。 これは安全な出発点ですが、より高性能なコードを書きたい場合、可能な限り、セッションロックを減らすか排除した方が良いでしょう。
セッションロック問題のデバッグ
もし「遅いページ」があり、あなたがそれをプロファイリングして、当該ページがロックの解放待ちだと判明した場合、これは全体のパフォーマンスを向上させるために以下のように簡単に修正できる可能性があります。
$CFG->debugsessionlock = 5; // 秒
セッションがN秒以上ロックされた場合、ロックを保持している他のページの詳細に関してデバッグコールが実行されます。
セッションロック解除
デフォルトではcoreは$SESSIONオブジェクトを変異させる必要があるかもしれないと想定されているため、ページが終了してシャットダウンハンドラがセッションロックを解放するまでセッションロックを保持することになります。 もし、あなたが長時間実行される可能性のあるページで作業している場合、セッションを変異させる可能性のある早期に実行されるロジックと長時間実行されるprocessinコードとを明確に分離してセッションロックを解除する必要があります。
\core\session\manager::write_close();
ページ内のリードオンリーセッション
この機能を使用するにはREADONLYセッションが有効にされている必要があり、同時にそれをサポートするコードも必要です。これはすべてのセッションではありません。
もし、あなたがセッションを決して変更せず、それでも読めるようにする必要があると事前にわかっている場合、ページを読み取り専用を宣言できます。これはページが他のhttpリクエストでセッションをブロックしないことを意味します。
define('READ_ONLY_SESSION', true);
ウェブサービスの読み取り専用セッション
ウェブサービスでも同じことが可能です。あなたがウェブサービスを宣言する場合、セッションロックを必要としないよう指定できます:
'core_message_get_unread_conversations_count' => array( 'classname' => 'core_message_external', 'methodname' => 'get_unread_conversations_count', 'classpath' => 'message/externallib.php', 'description' => '指定したユーザの未読会話数を取得します。', 'type' => 'read', 'ajax' => true, 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE), 'readonlysession' => true, // セッションは修正しません。 ),
セッションなし
もし、あなたのスクリプトに$SESSIONが必要ではない場合、宣言でより多くの処理およびロックを節約できます:
define('NO_MOODLE_COOKIES', true);
設定不要
極端な話、あなたがmoodle bootstrapの完全な実行を必要としない場合、以下でスキップできます:
define('ABORT_AFTER_CONFIG', true);