У меня есть задача, которая занимает около 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?