Оптимизация cron.php

27 Май 2008
Опубликовано VladSavitsky
Задача: 

Нужно, чтобы крон запускался часто (например, каждые 10 минут). При этом иногда возникают проблемы.
Запускаемые по крону модули, работают с внешними сайтами и связь с ними может быть плохой, то скрипт отключается по таймауту установленному в PHP.ini . Это нормальная ситуация, но крон портит все дело - он считает, что надо продолжать эту операцию целый час и выдает сообщение: "Время выполнения регулярных процедур превысило час, скорее всего это зависание". Целый час крон не работает, а выдает: "Попытка перезапуска выполнения регулярных процедур (cron) в то время, как они уже выполняются."

Задача

Нужно, чтобы крон запускался часто (например, каждые 10 минут). При этом иногда возникают проблемы.
Запускаемые по крону модули, работают с внешними сайтами и связь с ними может быть плохой, то скрипт отключается по таймауту установленному в PHP.ini . Это нормальная ситуация, но крон портит все дело - он считает, что надо продолжать эту операцию целый час и выдает сообщение: "Время выполнения регулярных процедур превысило час, скорее всего это зависание". Целый час крон не работает, а выдает: "Попытка перезапуска выполнения регулярных процедур (cron) в то время, как они уже выполняются."

Решение

Когда cron запускается, то Drupal устанавливает переменную "cron_semaphore" в текущее время для того, чтобы одновременно случайно не запустить два крона. Если вы уверены, что больше 5 минут у вас всё равно cron не будет работать, то можно попробовать поменять строчку 2507 в файле /includes/common.inc - функция drupal_cron_run :

  if ($semaphore) {
    if (time() - $semaphore > 3600) {
      // Either cron has been running for more than an hour or the semaphore
      // was not reset due to a database error.
      watchdog('cron', 'Cron has been running for more than an hour and is most likely stuck.', array(), WATCHDOG_ERROR);

      // Release cron semaphore
      variable_del('cron_semaphore');
    }
    else {
      // Cron is still running normally.
      watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
    }
  }

Попробуйте поменять в строке 2507 число 3600 на максимальное время (в секундах) работы вашего cron-скрипта. Эта ошибка исчезнет, но я, естественно, не могу гарантировать, что не появятся другие :)

Таким образом, если поставить семафор на 10 минут, а крон запускается каждые 6 минут, то при зависании крона после 1 пропуска запускается снова.

Использованные материалы:
Как оптимизировать cron.php

 
 
 

RSS-лента новостей

Dries Buytaert по-русски
]]>Русский поиск Drupal]]>

Перенос сайта из Joomla в Drupal
Перенос сайта из WordPress в Drupal

]]> Drupal - это бесплатная система управления контентом с открытым исходным кодом ]]>