「セッションロック (Dev docs)」の版間の差分

提供:MoodleDocs
移動先:案内検索
編集の要約なし
(done.)
 
(同じ利用者による、間の7版が非表示)
1行目: 1行目:
作成中です - [[利用者:Mitsuhiro Yoshida|Mitsuhiro Yoshida]] ([[利用者・トーク:Mitsuhiro Yoshida|トーク]])
あなたが通常のmoodleページを作成してconfig.phpをインクルードした場合、デフォルトで大量のmoodleブートストラップが実行された後、$SESSIONグローバルが設定されます。
あなたが通常のmoodleページを作成してconfig.phpをインクルードした場合、デフォルトで大量のmoodleブートストラップが実行された後、$SESSIONグローバルが設定されます。
これは安全な出発点ですが、より高性能なコードを書きたい場合、可能な限り、セッションロックを減らすか排除した方が良いでしょう。
これは安全な出発点ですが、より高性能なコードを書きたい場合、可能な限り、セッションロックを減らすか排除した方が良いでしょう。


== セッションロック問題のデバッグ  ==
== セッションロック問題のデバッグ  ==
もし「遅いページ」があり、あなたがそれをプロファイリングして、当該ページがロックの解放を待っているのだと判明した場合、これは全体のパフォーマンスを向上させるために簡単に修正できる可能性があります。
もし「遅いページ」があり、あなたがそれをプロファイリングして、当該ページがロックの解放待ちだと判明した場合、これは全体のパフォーマンスを向上させるために以下のように簡単に修正できる可能性があります。
  $CFG->debugsessionlock = 5; // 秒
  $CFG->debugsessionlock = 5; // 秒
セッションがN秒以上ロックされた場合、ロックを保持している他のページの詳細に関してデバッグコールが実行されます。
セッションがN秒以上ロックされた場合、ロックを保持している他のページの詳細に関してデバッグコールが実行されます。
== セッションロック解除 Session unlocking ==
== セッションロック解除 ==
By default core assumes that you might need to mutate the $SESSION object so it will hold a lock on the session until the page finished and a shutdown handler will release the session lock.
デフォルトではcoreは$SESSIONオブジェクトを変異させる必要があるかもしれないと想定されているため、ページが終了してシャットダウンハンドラがセッションロックを解放するまでセッションロックを保持することになります。
デフォルトではcoreは$SESSIONオブジェクトを変異させる必要があるかもしれないと想定されているため、ページが終了してシャットダウンハンドラがセッションロックを解放するまでセッションロックを保持することになります。
If you are working on any page which is potentially long running, then you should cleanly separate logic which runs early which could mutate the session from the long running processin code and unlock the session.
もし、あなたが長時間実行される可能性のあるページで作業している場合、セッションを変異させる可能性のある早期に実行されるロジックと長時間実行されるprocessinコードとを明確に分離してセッションロックを解除する必要があります。
もし、あなたが長時間実行される可能性のあるページで作業している場合、セッションを変異させる可能性のある早期に実行されるロジックと長時間実行されるprocessinコードとを明確に分離して、セッションロックを解除する必要があります。
  \core\session\manager::write_close();
  \core\session\manager::write_close();
== Read only session in pages ==
== ページ内のリードオンリーセッション ==
For this to work, READONLY sessions must be enabled as well needing your code to support it. Not all session
この機能を使用するにはREADONLYセッションが有効にされている必要があり、同時にそれをサポートするコードも必要です。これはすべてのセッションではありません。


If you know ahead of time that you will never mutate the session, but you still need to be able to read it, then you can declare your page to be read only. This will mean your page will never block the session in another http request.
もし、あなたがセッションを決して変更せず、それでも読めるようにする必要があると事前にわかっている場合、ページを読み取り専用を宣言できます。これはページが他のhttpリクエストでセッションをブロックしないことを意味します。
  define('READ_ONLY_SESSION', true);
  define('READ_ONLY_SESSION', true);
== Read only sessions in web services ==
== ウェブサービスの読み取り専用セッション ==
The same is possible in web services. When you declare your web service you can specify it will not need a session lock:
ウェブサービスでも同じことが可能です。あなたがウェブサービスを宣言する場合、セッションロックを必要としないよう指定できます:
 
      'core_message_get_unread_conversations_count' => array(
      'core_message_get_unread_conversations_count' => array(
         'classname' => 'core_message_external',
         'classname' => 'core_message_external',
         'methodname' => 'get_unread_conversations_count',
         'methodname' => 'get_unread_conversations_count',
         'classpath' => 'message/externallib.php',
         'classpath' => 'message/externallib.php',
         'description' => 'Retrieve the count of unread conversations for a given user',
         'description' => '指定したユーザの未読会話数を取得します。',
         'type' => 'read',
         'type' => 'read',
         'ajax' => true,
         'ajax' => true,
         'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
         'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
         '''<nowiki>'readonlysession' => true, // We don't modify the session.</nowiki>'''
         '''<nowiki>'readonlysession' => true, // セッションは修正しません。</nowiki>'''
     ),  
     ),  
== No session at all ==
== セッションなし ==
If your script doesn't actually need $SESSION in the first place then save even more processing and locks by declaring:
もし、あなたのスクリプトに$SESSIONが必要ではない場合、宣言でより多くの処理およびロックを節約できます:
  define('NO_MOODLE_COOKIES', true);
  define('NO_MOODLE_COOKIES', true);
== No config is needed ==
== 設定不要 ==
Going to the absolute extreme, if you do not even need the full moodle bootstrap to run then you can skip it via:
極端な話、あなたがmoodle bootstrapの完全な実行を必要としない場合、以下でスキップできます:
  define('ABORT_AFTER_CONFIG', true);
  define('ABORT_AFTER_CONFIG', true);


[[en:Development:Session_locks]]
[[en:Development:Session_locks]]

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);