本文介绍在Moodle(魔灯)开发中如何处理会话锁【session locks】。
当你创建一个普通的moodle页面并包含config.php时,默认情况下,在php运行大量moodle引导代码后,将拥设置好一个名为$SESSION全局变量。这是一个安全的启动假设,但在编写更高性能的代码时,最好尽可能减少或消除会话锁。
1 调试会话锁问题
如果你发现访问某个页面时特别慢,在对做了分析之后,发现正在等待一个锁释放,那么这可能是一件很容易修复的事情,可以提高你的整体性能。
$CFG->debugsessionlock=5;//以秒为单位的时间
当一个会话被锁定N秒以上时,将进行一次调试调用,详细说明哪个页面在正在锁定。
2 会话解锁【unlocking】
默认情况下,moodle内核【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);