Drupal → Универсальная очередь для выполнения произвольных функций
Часто хочется выполнить отложенно какие-то функции, без описания очереди в 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', ), ), ), ));
Комментарии
Браво!
Все гениальное - просто!
Выполнение функций в очереди происходит во время запускай крона?
по умолчанию да
А каким образом можно снять выполнение с системного крона друпала? И запускать через собственный файл.
скопируйте cron.php, измените под свои нужды
Плохой совет. Правильный - поставить что-то вроде elysia cron и либо объявить очередь через hook_cron_queue_info, либо уже свой крон джоб создать и прямо там процессить уже существующую очередь.
elysia cron именно так и делает если вы не знали - http://cgit.drupalcode.org/elysia_cron/tree/cron.php
Если по этому принципу в очередь добавить несколько функций, то как я понимаю за один запуск крона выполнится только одна функция. Как тогда сделать чтобы прошла вся очередь?
Выполнится столько функций, сколько уложится в лимит 1 сек.
А, понял, надо в cron_queue_info прописать 'time'. Спасибо за быстрый ответ.
Оставить комментарий