Убил сегодня утром два часа на то, чтобы найти корень проблемы. Пытаюсь запустить Cron через админку: Администрирование → Конфигурация → Система → Cron → Запустить cron. А он не запускается, выдаёт ошибку.
Как бы нехорошо. Я тут собрался переиндексировать поисковые индексы, а оно не работает... Вечером сбросил индекс, а он утром до 100% так и не добрался, хотя должен был.
Первым делом полез в логи PHP, а там:
[07-Aug-2022 10:29:11 Europe/Moscow] PHP Fatal error: Maximum execution time of 240 seconds exceeded in drupal\core\lib\Drupal\Core\Database\StatementWrapper.php on line 145
Очень странно. Первая странность в том, что при попытке запустить Cron вручную никаких 240 секунд не проходит, ошибка выдаётся моментально. А вторая странность в том, что таймаут 240 секунд у меня нигде не настроен. Лезу в код и нахожу в \core\lib\Drupal\Core\Cron.php вот такую строку:
// Try to allocate enough time to run all the hook_cron implementations. Environment::setTimeLimit(240);
Ай-ай-ай. Костыли в коде. Эту штуку нужно было в конфиг вынести. Но это не отвечает на вопрос, почему по кнопку Cron в админке не запускается.
Включаю подробное логирование в настройках Cron. Сохранить конфигурацию. И теперь в отчёте Администрирование → Отчёты → Последние записи журнала → Подробности явно отображается ошибка:
Попытка перезапуска выполнения регулярных процедур (cron) в то время, как они уже выполняются.
Непонятно почему я тут Гость, ну да ладно. Теперь всё стало понятно. Cron в админке друпала не получается запустить, потому что он уже запущен. А за целую ночь Cron не смог проиндексировать сайт потому, что постоянно падает с ошибкой "Maximum execution time of 240 seconds".
Полечим.
Первое, исправим в \core\lib\Drupal\Core\Cron.php в функции "setTimeLimit(240)" на значение, которое у нас прописано в php.ini. По-моему, у меня там стоит 10 минут, правлю на 600. Это временное решение, после обновления ядра друпала все наши изменения пропадут.
Нам нужно уменьшить время выполнения задач. Администрирование → Конфигурация → Поиск и метаданные → Страницы поиска меняем количество пунктов, индексируемых за один запуск cron в меньшую стороны. Если вы используете другие расширения типа Search Api, то там тоже можно настраивать количество элементов, индексируемых за один раз.
В админке можно настроить запуск Cron максимум раз в час, чаще не получается, поэтому, можно настроить внешний запуск Cron с помощью URL с той частотой, которая нам нужна. Но это уже другая история.