xandeadx.ru Блог музицирующего веб-девелопера

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',
      ),
    ),
  ),
));
Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Браво!

Все гениальное - просто!

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

по умолчанию да

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

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

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

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

elysia cron именно так и делает если вы не знали - http://cgit.drupalcode.org/elysia_cron/tree/cron.php

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании