Drupal → Универсальная очередь для выполнения произвольных функций

12.05.2016

Часто хочется выполнить отложенно какие-то функции, без описания очереди в 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
Похожие записи

Комментарии

Гость
20.09.2016, 15:10

Выполнение функций в очереди происходит во время запускай крона?

Гость
20.09.2016, 15:23

А каким образом можно снять выполнение с системного крона друпала? И запускать через собственный файл.

скопируйте cron.php, измените под свои нужды

Гость
10.10.2016, 23:28

скопируйте cron.php, измените под свои нужды

Плохой совет. Правильный - поставить что-то вроде elysia cron и либо объявить очередь через hook_cron_queue_info, либо уже свой крон джоб создать и прямо там процессить уже существующую очередь.

Николай
19.07.2018, 15:10

Если по этому принципу в очередь добавить несколько функций, то как я понимаю за один запуск крона выполнится только одна функция. Как тогда сделать чтобы прошла вся очередь?

Выполнится столько функций, сколько уложится в лимит 1 сек.

Николай
19.07.2018, 15:20

А, понял, надо в cron_queue_info прописать 'time'. Спасибо за быстрый ответ.

Добавить комментарий