Moodle作业模块后台处理任务因缺失记录失败求助
解决Moodle 4.1.4中mod_assign定时任务持续失败的问题
问题根源
从错误日志可明确:mod_assign\task\cron_task任务尝试访问ID为341的作业记录,但该记录已从数据库删除,而关联的课程模块数据未被清理,导致任务每次执行都会触发查询失败。
解决方案
1. 清理数据库残留关联数据(推荐)
从数据库层面清除无效关联记录,从根源解决问题:
- 先确认
assign表中无ID=341的记录:SELECT * FROM mdl_assign WHERE id = 341; - 查询
course_modules表是否存在关联该作业的残留记录:SELECT cm.* FROM mdl_course_modules cm JOIN mdl_modules md ON md.id = cm.module WHERE cm.instance = 341 AND md.name = 'assign'; - 若存在上述记录,执行删除操作:
DELETE cm FROM mdl_course_modules cm JOIN mdl_modules md ON md.id = cm.module WHERE cm.instance = 341 AND md.name = 'assign';
2. 修改代码增加容错(临时方案)
若暂时无法操作数据库,可修改assign模块的cron逻辑,让任务自动跳过不存在的作业(注意:Moodle升级后该修改会被覆盖,需重新调整):
- 打开文件
/mod/assign/locallib.php,找到assign::cron()方法中调用get_coursemodule_from_instance的代码行 - 将原代码中的
MUST_EXIST参数改为IGNORE_MISSING,并增加判断逻辑:// 原代码 // $cm = get_coursemodule_from_instance('assign', $assign->id, 0, false, MUST_EXIST); // 修改后 $cm = get_coursemodule_from_instance('assign', $assign->id, 0, false, IGNORE_MISSING); if (!$cm) { debugging("Skipping non-existent assignment ID {$assign->id}", DEBUG_INFO); continue; }
3. 清除Moodle缓存
完成上述操作后,登录Moodle后台,进入站点管理 → 开发 → 清除缓存,全选所有缓存类型并执行清除,确保任务队列的缓存更新。
内容的提问来源于stack exchange,提问作者Pob808
相关产品推荐
相关产品推荐

