Moodle 4.1.4, MSSQL, PHP 8.1
Запланированная задача \mod_assign\task\cron_task продолжает терпеть неудачу, потому что она пытается прочитать задание, которого нет (я думаю). Полное сообщение об ошибке:
Execute scheduled task: Background processing for assignment module (mod_assign\task\cron_task)
... started 09:11:36. Current memory use 20.7 MB.
Debugging increased temporarily due to faildelay of 120
... used 468 dbqueries
... used 1.6565690040588 seconds
Scheduled task failed: Background processing for assignment module (mod_assign\task\cron_task),Can't find data record in database.
Debug info:
SELECT cm.*, m.name, md.name AS modname
FROM {course_modules} cm
JOIN {modules} md ON md.id = cm.module
JOIN {assign} m ON m.id = cm.instance
WHERE m.id = :instance AND md.name = :modulename
[array (
'instance' => '341',
'modulename' => 'assign',
)]
Backtrace:
* line 1317 of \lib\datalib.php: call to moodle_database->get_record_sql()
* line 2849 of \mod\assign\locallib.php: call to get_coursemodule_from_instance()
* line 44 of \mod\assign\classes\task\cron_task.php: call to assign::cron()
* line 263 of \lib\cronlib.php: call to mod_assign\task\cron_task->execute()
* line 120 of \lib\cronlib.php: call to cron_run_inner_scheduled_task()
* line 73 of \lib\cronlib.php: call to cron_run_scheduled_tasks()
* line 178 of \admin\cli\cron.php: call to cron_run()
Я не знаю, как мне помешать ему получить доступ к этому заданию. Кто-нибудь еще испытал это?
Я удалил ошибки, но они продолжают появляться.






Эту проблему сложно исправить: похоже, модуль курса был удален, но задание все еще существует.
Если вы посмотрите на код в конце public static function cron() в /mod/assign/locallib.php
// Update calendar events to provide a description.
$sql = 'SELECT id
FROM {assign}
WHERE
allowsubmissionsfromdate >= :lastruntime AND
allowsubmissionsfromdate <= :timenow AND
alwaysshowdescription = 0';
$params = array('lastruntime' => $lastruntime, 'timenow' => $timenow);
$newlyavailable = $DB->get_records_sql($sql, $params);
foreach ($newlyavailable as $record) {
$cm = get_coursemodule_from_instance('assign', $record->id, 0, false, MUST_EXIST);
$context = context_module::instance($cm->id);
$assignment = new assign($context, null, null);
$assignment->update_calendar($cm->id);
}
Он циклически выполняет задания и обновляет календарь, но модуль курса не существует.
Вы можете попробовать проверить журнал, чтобы узнать, когда и кем было удалено задание.
SELECT logs.contextid AS coursemoduleid, logs.userid, u.firstname, u.lastname, logs.action, logs.*
FROM mdl_logstore_standard_log logs
JOIN (
SELECT DISTINCT loghistory.contextid
FROM mdl_logstore_standard_log loghistory
WHERE loghistory.objecttable = 'assign'
AND loghistory.objectid = 341 /* assign id */
) deletedassign ON logs.contextid = deletedassign.contextid AND logs.contextlevel = 70 /* course modules only */
LEFT JOIN mdl_user u ON u.id = logs.userid
ORDER BY logs.timecreated DESC
LIMIT 10
Последний action следует удалить — если это не так, то запись модуля курса, вероятно, была удалена каким-то ошибочным кодом, пользовательским кодом или вручную в SQL.
Быстрое решение — обновить значение AlwaysshowDescription до 1, чтобы оно не включалось в цикл, но это может создать проблемы в других местах.
UPDATE mdl_assign
SET alwaysshowdescription = 1
WHERE id = 341
Также, возможно, проверьте, есть ли какие-либо другие задания с отсутствующим модулем курса. Если их больше 1, это может стать более серьезной проблемой.
SELECT *
FROM mdl_assign a
LEFT JOIN mdl_course c ON c.id = a.course
WHERE NOT EXISTS (
SELECT cm.id
FROM mdl_course_modules cm
JOIN mdl_modules m ON m.id = cm.module AND m.name = 'assign'
WHERE cm.instance = a.id
)
Я сейчас не на своем рабочем месте, но я бы, вероятно, написал код для вызова функции удаления назначения, чтобы все связи также были полностью удалены, или взглянул бы на код удаления для связанных таблиц.
Спасибо Расселу. Вы правы, задание 341 находится в {assign}, но не в {course_modules}. Спасибо за ваш код; он подтвердил, что это единственное задание без соответствующего модуля курса. Я попробовал журналы, но, к сожалению, журналы хранятся в течение года, а для этого задания изменена дата - сентябрь 2022 года, поэтому журнал исчез. Ни в {assignsubmission_onlinetext}, ни в {assignsubmission_file} нет записей для задания 341, поэтому мне интересно, может ли решение состоять в удалении записи из {assign}.