Часто хочется выполнить отложенно какие-то функции, без описания очереди в hook_cron_queue_info()
и реализации worker callback-a. Сделать это можно несколькими строчками кода:
/**
* Implements hook_cron_queue_info().
*/
function modulename_cron_queue_info() {
$queues['universal_queue'] = array(
'worker callback' => 'modulename_universal_queue_callback',
);
return $queues;
}
/**
* Universal queue worker callback.
*/
function modulename_universal_queue_callback($data) {
if (isset($data['file'])) {
include_once DRUPAL_ROOT . '/' . $data['file'];
}
call_user_func_array($data['function'], $data['arguments']);
}
Использование:
/** @var SystemQueue $queue */
$queue = DrupalQueue::get('universal_queue');
// Отложенно удалить ноду
$queue->createItem(array(
'function' => 'node_delete',
'arguments' => array(
'nid' => 123,
),
));
// Отложенно скачать файл
$queue->createItem(array(
'function' => 'system_retrieve_file',
'arguments' => array(
'url' => 'http://img.yandex.net/i/www/logo.png',
'destination' => 'public://image',
),
));
// Отложенно послать письмо
$queue->createItem(array(
'function' => 'drupal_mail',
'arguments' => array(
'module' => 'system',
'key' => 'mail',
'to' => 'to@example.com',
'language' => language_default(),
'params' => array(
'context' => array(
'subject' => 'Some subject',
'message' => 'Some message',
),
),
),
));
Написанное актуально для
Drupal 7
Похожие записи
Комментарии
Браво!
Все гениальное - просто!
Выполнение функций в очереди происходит во время запускай крона?
по умолчанию да
А каким образом можно снять выполнение с системного крона друпала? И запускать через собственный файл.
скопируйте cron.php, измените под свои нужды
Плохой совет. Правильный - поставить что-то вроде elysia cron и либо объявить очередь через hook_cron_queue_info, либо уже свой крон джоб создать и прямо там процессить уже существующую очередь.
elysia cron именно так и делает если вы не знали - http://cgit.drupalcode.org/elysia_cron/tree/cron.php
Если по этому принципу в очередь добавить несколько функций, то как я понимаю за один запуск крона выполнится только одна функция. Как тогда сделать чтобы прошла вся очередь?
Выполнится столько функций, сколько уложится в лимит 1 сек.
А, понял, надо в cron_queue_info прописать 'time'. Спасибо за быстрый ответ.
Добавить комментарий