Справка по отладке "запуск cron превысил ограничение по времени"


Я написал пользовательский модуль (для Drupal 7 и PHP 5.3), который использует hook_nodeapi() и не разрешает доступ к определенному типу узла, а просто перенаправляет (с помощью drupal_goto()) на главную страницу списка с предупреждающим сообщением.

Однако у меня есть подозрение, что модуль Boost (с включенным "Не кэшировать страницы с сообщениями") захлебывается при запуске cron, когда доходит до этих типов контента, и продолжает перенаправляться (я не знаю, как точно работает Boost, но я предполагаю, что он кэширует несколько страницы на запусках cron?).

Причина моих подозрений и реальная проблема в том, что cron после определенного количества запусков начинает завершаться сбоем с сообщением об ошибке "Запуск Cron превысил ограничение по времени и был прерван"., и сразу после этого сообщения на Watchdog появляется следующее сообщение: "На этой странице есть сообщения Drupal, предотвращающие кэширование boost".

Я поместил отладочный фрагмент кода на module.inc (взломанное ядро, как было предложено здесь), чтобы увидеть, какой модуль был ответственен за этот сбой, и каждый раз, когда происходит сбой cron, последним модулем, который обращался к Cron, кажется, является модуль "Поиск" (основной):

Повышение 22/02/2012 - 9:00 По этому поводу есть сообщения Drupal... Анонимный
cron 22/02/2012 - 9:00 Запуск Cron превысил лимит времени и был прерван. Анонимный
cron 22/02/2012 - 9:00 утра нажмите поисковый анонимный cron
cron 22/02/2012 - 9:00 утра анонимный доступ к узлу cron
крон 22/02/2012 - 9:00 утра анонимный хит фильтра cron
cron 22/02/2012 - 9:00 утра хит dblog cron Анонимный
повышение 22/02/2012 - 9:00 утра Просроченные устаревшие файлы из статического кэша страниц. Анонимный
cron 22/02/2012 - 9:00 утра хит повышения анонимного cron

С тех пор я сократил количество страниц для индексации, но это не помогло. Cron, который запускается после поискового cron, является "системным" cron, но я понятия не имею, что именно делает этот cron.

В раздражает то, что вы заходите на страницу cron, набирая текст в браузере http://address/cron.php или через командную строку wget http://address/cron.php он работает нормально. Но из заданий cron системы он в конечном итоге сталкивается с этой проблемой после нескольких успешных запусков cron.

Я был бы признателен за любую помощь в решении этой проблемы или за толчок в правильном направлении. Спасибо.

/**
 * Implements hook_nodeapi().
 */
function rhask_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'view':
      if($node->type == 'question' && arg(0) == 'node' && !user_access('administer questions')){
        drupal_set_message('Access Denied - You cannot access this content directly. Please use this page.', 'warning');
        drupal_goto('ask');
      }
      break;
  }
}

Думаю, я мог бы сделать перенаправление без установки какого-либо сообщения. Это может решить проблему, если действительно Boost вызывая проблемы с cron, я отредактирую это сообщение, когда получу какой-либо результат.


Редактировать: Cron успешно запускается каждые 30 минут со вчерашнего дня, и изменения, которые я внес в настройки модуля XMLSitemap, похоже, сделали свое дело. Я буду продолжать следить за этим сайтом еще несколько дней.

Правка2: Крон все еще терпит неудачу. Я удалил drupal_set_message, поэтому теперь он перенаправляет без установки каких-либо сообщений. Однако это не мешает cron неудача. Boost больше не жалуется и просто регистрирует "Устаревшие файлы с истекшим сроком действия из статического кэша страниц". Я не знаю, как действовать дальше, чтобы изолировать эту проблему.

Author: kiamlaluno, 2012-02-22

2 answers

Я подозреваю, что вы могли бы проверить это arg(0) == "node" и is_numeric(arg(1)), которые определили бы внутренний путь для отображения узла, а не cron. Вам также нужно будет проверить arg(2) на "редактировать" и некоторые другие, которые могут (или не могут) отображаться как локальные задачи для ваших узлов.

 0
Author: mpdonadio, 2012-02-22 11:30:24

Мы решили эту проблему. drupal_goto вызывает hook_exit, что приводило к сбою запуска cron. Мы остановили это, проверив переменную $a4 из hook_nodeapi, если это не NULL (означает, что она вызывается из node_view(), а не из cron), затем продолжайте drupal_goto

 0
Author: Beebee, 2012-05-01 10:51:58