У меня есть задача, которая занимает около 45 минут и должна выполняться каждый день (синхронизация пользователей с несколькими внешними базами данных и т. Д.).
Чтобы справиться с работой, я настроил очередь cron hook_cron_queue_info()
следующим образом:
function mymodule_cron_queue_info() {
$queues = array();
$queues['update_users_queue'] = array(
'worker callback' => '_mymodule_process_user_queue_item',
'time' => 120,
);
return $queues;
}
Я заполняю очередь, используя эту функцию:
function mymodule_queue_all_users_for_synching() {
//...query for users...
$queue = DrupalQueue::get('update_users_queue');
foreach($users as $user) {
$queue->createItem($user);
}
}
Функция заполнения очереди вызывается как задача cron. Я использую Elysia Cron , поэтому моя реализация hook_cronapi()
:
function mymodule_cronapi($op, $job = NULL) {
$items = array();
$items['queue_users_for_synch'] = array(
'description' => 'Queue all user accounts for synching.',
'rule' => '0 3 * * *', // Run this job every day at 3am.
'callback' => 'mymodule_queue_all_users_for_synching',
);
return $items;
}
Рабочая функция для каждого элемента очереди, определенного в mymodule_cron_queue_info
:
function _mymodule_process_user_queue_item($item) {
//...synchronize user ($item)...
}
У меня вопрос, когда Cron действительно начнет обрабатывать очередь?
Скажем, я заполняю очередь каждый день в 3 часа ночи и хочу обработать ее 120 секунд из каждых 30 минут, пока она не будет завершена - нужно ли создавать еще одну задачу cron?
Ответы:
Когда Drupal запускает задачи cron, он автоматически обрабатывает любую очередь cron, определенную из модулей, в
drupal_cron_run()
; Сначалаhook_cron()
вызываются реализации, а затем очереди cron очищаются.Кроме того
hook_cronapi()
, вы можете добавить запись для другой функции, обрабатывающей очередь cron вашего модуля.Альтернатива - позволить Drupal обрабатывать очередь cron для вас, но это происходит, когда выполняются задачи cron Drupal. Если вы хотите чаще очищать очередь cron вашего модуля, вы можете добавить только новую задачу cron, обрабатываемую модулем Elysia Cron.
Модуль Elysia Cron обрабатывает очереди cron
elysia_cron_run()
; эта функция вызывается изelysia_cron_cron()
(реализацияhook_cron()
),drush_elysia_cron_run_wrapper()
(обратный вызов команды Drush) и из своего собственного cron.php . Если вы следовали инструкциям в файле INSTALL.txt (в частности, в «ШАГ B: ИЗМЕНИТЬ СИСТЕМУ CRONTAB (ДОПОЛНИТЕЛЬНО)») и заменили любой вызов http://example.com/cron.php на http: // example .com / sites / all / modules / elysia_cron / cron.php , модуль Elysia Cron уже должен обрабатывать очереди cron. Код, который я предложил, можно использовать для ускорения обработки очередей cron, используемых в вашем модуле, если это действительно необходимо.источник
cron.php
? Если это так, то это происходит каждую минуту (см. Мой первый комментарий к ответу @ David).elysia_cron_run
которой очереди cron автоматически обрабатываются каждый раз, когда запрашивается elysia cron.php.Очередь будет заполняться через крючок Elysia cronapi в установленное время.
Однако очередь будет обрабатываться всякий раз, когда происходит стандартный запуск Cron Drupal.
Смотрите этот рабочий фрагмент обработки обратного вызова в конце ядра: drupal_cron_run
источник
cron.php
сценария Elysia каждую минуту , что позволяет Elysia контролировать время выполнения задач с поминутным разрешением. Хотя на самом деле ни одна задача не выполняется каждую минуту - что заставило меня думать, что мне нужно создать задачу, специально предназначенную для работы с очередями?drupal_cron_run
вызывается, ваш обратный вызов работника очереди cron будет обработан.drupal_cron_run
не вызывается изcron.php
скрипта Elysia (когда Elysia включена);elysia_cron_run
используется вместоhook_cron_queue_info
с Elysia cron, если вы не укажете свой собственный обратный вызов работника, как показано вdrupal_cron_run
фрагменте основной функции выше.elysia_cron_run
не называемdrupal_cron_run
, но это делает вызовmodule_invoke_all('cron_queue_info')
и делает некоторые модные штаны многоканальную обработки , что марка дыма выходит мои уши.как указано выше при использовании Elysia Cron, ваши очереди не обрабатываются.
у вас (и у drupal) нет доступа к очередям, которые иначе запускались бы на drupal_run_cron
Обходной путь - создать пользовательскую задачу cron - (это будет видно для elysia cron), чтобы либо обработать все очереди, либо ту, которую вы хотите, и вызвать обработку очереди там. то есть:
теперь обработка очередей может контролироваться ElysiaCron
источник
Я не использую Elysia, но мое решение всегда было примерно таким:
Он обрабатывает только один предмет, для каждого запуска cron. Может быть, вы хотите изменить это.
источник
Я также пытался обдумать это, поскольку впервые использую API очереди вместе с Elysia cron. При ближайшем рассмотрении вы увидите, что Elysia cron выполняет элементы очереди при вызове функции elysia_cron_run . Смотрите этот фрагмент строки 1044 в файле elysia_cron.module :
Это помогло демистифицировать обработку очередей для меня при использовании Elysia cron.
источник