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

提供:MoodleDocs
移動先:案内検索
編集の要約なし
編集の要約なし
3行目: 3行目:
When you create a normal moodle page and include config.php then by default a large amount of moodle bootstrapping runs and you will have the $SESSION global setup for you. あなたが通常のmoodleページを作成およびconfig.phpをインクルードした場合、デフォルトで大量のmoodleブートストラップが実行された後、$SESSIONグローバルが設定されます。
When you create a normal moodle page and include config.php then by default a large amount of moodle bootstrapping runs and you will have the $SESSION global setup for you. あなたが通常のmoodleページを作成およびconfig.phpをインクルードした場合、デフォルトで大量のmoodleブートストラップが実行された後、$SESSIONグローバルが設定されます。
This is a safe starting assumption but when writing higher performance code it is better to reduce or eliminate the session locks where possible.
This is a safe starting assumption but when writing higher performance code it is better to reduce or eliminate the session locks where possible.
これは安全な出発点ですが、より高性能なコードを書く場合、可能な限りセッションロックを減らすか排除した方が良いでしょう。
== Debugging session lock issues ==
== Debugging session lock issues ==
If you have 'pages that are slow' and you profile them and see that you are waiting on a lock to free up then this is potentially an easy thing to fix to improve your overall performance.
If you have 'pages that are slow' and you profile them and see that you are waiting on a lock to free up then this is potentially an easy thing to fix to improve your overall performance.

2023年5月21日 (日) 15:01時点における版

作成中です - Mitsuhiro Yoshida (トーク)

When you create a normal moodle page and include config.php then by default a large amount of moodle bootstrapping runs and you will have the $SESSION global setup for you. あなたが通常のmoodleページを作成およびconfig.phpをインクルードした場合、デフォルトで大量のmoodleブートストラップが実行された後、$SESSIONグローバルが設定されます。 This is a safe starting assumption but when writing higher performance code it is better to reduce or eliminate the session locks where possible. これは安全な出発点ですが、より高性能なコードを書く場合、可能な限りセッションロックを減らすか排除した方が良いでしょう。

Debugging session lock issues

If you have 'pages that are slow' and you profile them and see that you are waiting on a lock to free up then this is potentially an easy thing to fix to improve your overall performance.

$CFG->debugsessionlock = 5; // Time in seconds

When a session is locked for more N seconds a debugging call will be made with details of what the other page was which is holding onto the lock.

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. 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.

\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

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.

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(
        'classname' => 'core_message_external',
        'methodname' => 'get_unread_conversations_count',
        'classpath' => 'message/externallib.php',
        'description' => 'Retrieve the count of unread conversations for a given user',
        'type' => 'read',
        'ajax' => true,
        'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        'readonlysession' => true, // We don't modify the session.
    ), 

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:

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:

define('ABORT_AFTER_CONFIG', true);