Moodle «Фоновая обработка модуля назначения» не удалась из-за отсутствия записи

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()

Я не знаю, как мне помешать ему получить доступ к этому заданию. Кто-нибудь еще испытал это?

Я удалил ошибки, но они продолжают появляться.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эту проблему сложно исправить: похоже, модуль курса был удален, но задание все еще существует.

Если вы посмотрите на код в конце 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}.

Pob808 23.05.2024 14:03

Я сейчас не на своем рабочем месте, но я бы, вероятно, написал код для вызова функции удаления назначения, чтобы все связи также были полностью удалены, или взглянул бы на код удаления для связанных таблиц.

Russell England 23.05.2024 15:35

Другие вопросы по теме