MOODLE的会话锁

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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注