MOODLE的會話鎖

本文介紹在Moodle(魔燈)開發(fā)中如何處理會話鎖【session locks】。

當你創(chuàng)建一個普通的moodle頁面并包含config.php時,默認情況下,在php運行大量moodle引導代碼后,將擁設置好一個名為$SESSION全局變量。這是一個安全的啟動假設,但在編寫更高性能的代碼時,最好盡可能減少或消除會話鎖。

1 調(diào)試會話鎖問題

如果你發(fā)現(xiàn)訪問某個頁面時特別慢,在對做了分析之后,發(fā)現(xiàn)正在等待一個鎖釋放,那么這可能是一件很容易修復的事情,可以提高你的整體性能。

$CFG->debugsessionlock=5;//以秒為單位的時間

當一個會話被鎖定N秒以上時,將進行一次調(diào)試調(diào)用,詳細說明哪個頁面在正在鎖定。

2 會話解鎖【unlocking】

默認情況下,moodle內(nèi)核【core】假設您可能需要修改$SESSION對象,所以它將在會話上保持鎖,直到頁面處理完成時由shutdown handle釋放會話鎖。如果您正在處理可能長時間運行的頁面,那么您應該對代碼做清晰的分離,把需要修改會話的代碼和需要長時間運行的代碼分離開來,并在修改會話后解鎖會話。

\core\session\manager::write_close();

3 頁面中的只讀會話【read only session】

要使只讀會話起作用,必須啟用只讀會話,并且需要您的代碼來支持它。

如果你提前知道你永遠不會改變會話,但你仍然需要能夠讀會話,那么你可以將你的頁面聲明為只讀會話。這意味著您的頁面永遠不會在另一個http請求中阻止會話。

define('READ_ONLY_SESSION', true);

4 web服務中的只讀會話

在web服務中也是如此。聲明web服務時,可以指定它不需要會話鎖:

5 完全不用會話

如果您的代碼完全不需要訪問$SESSION,那么可以聲明:

define('NO_MOODLE_COOKIES', true);

6 不需要配置

更極端的一種情況,如果您甚至不需要運行完整的moodle引導代碼,那么您可以通過以下方式跳過它:

define('ABORT_AFTER_CONFIG', true);

發(fā)表評論

您的電子郵箱地址不會被公開。 必填項已用*標注