本文介紹在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);