Очереди

Очереди (англ. Queues) — API в Drupal, который позволяет формировать из данных очередь для дальнейшей обработки.

Благодаря очередям, вы можете обрабатывать данные постепенно, когда и как угодно. Как правило, очереди обрабатывают ежеминутным кроном.

Вы сами решаете, какой будет очередь, добавляете в неё элементы, удаляете, чистите и обрабатываете.

По умолчанию, очереди хранятся в БД. Вы можете расширять функционал и создавать свои форматы очередей, например в памяти, memcache, redis и т.д.

Совет

В Drupal также имеется Batch API, который построен поверх очередей и предоставляет альтернативный способ обработки данных, но за один вызов и с пользовательским интерфейсом.

Получение очереди

Работа с очередями осуществляется при помощи сервиса queue. В нём присутствует всего один метод get().

При помощи данного метода вы можете получать экземпляры конкретных очередей. Метод принимает следующие аргументы:

  • $name: Название очереди, которую вы желаете получить.
  • $reliable: (опционально) TRUE если порядок элементов очереди должен соблюдаться и каждый элемент очереди гарантированно должен быть обработан, FALSE, если масштабируемость в приоритете. По умолчанию FALSE. Иными словами, данный аргумент позволяет создать свой собственный сервис, который будет отвечать за работу с очередью. Он может влиять на весь процесс работы с очередью. По умолчанию используется queue.database сервис, который хранит очереди в БД (и также является reliable хранилищем, с гарантией порядка и выполнения каждого элемента).

Пример получения очереди:

/** \Drupal\Core\Queue\QueueInterface $queue */
$queue = \Drupal::queue('foo');

В примере выше запрашивается очередь с названием foo. В качестве результата будет объект очереди, реализующий \Drupal\Core\Queue\QueueInterface.

Взаимодействие с очередью

Работа с очередью производится через объект полученный при её запросе. Объекты очередей всегда имеют определенные методы и для вас не должно быть разницей, используется ли обработчик по умолчанию или нет.

createItem()

Метод createItem() позволяет добавить элемент в очередь. Принимает один единственный аргумент $data, который может быть чем угодно. В качестве результата возвращает уникальный ID элемента очереди, куда были сохранены данные.

Пример:

$data = ['foo', 'bar'];
$queue->createItem($data);

numberOfItems()

Метод numberOfItems() возвращает текущее количество элементов находящихся в очереди.

Результат работы метода не гарантируется точность данных. В них может быть погрешность. В зависимости от реализации, настройки и того, как используется очередь, точность результата может отличаться. На высоконагруженных системах точность может быть актуально только в пределах нескольких секунд.

Пример:

$queue->numberOfItems();

claimItem()

Метод claimItem() запрашивает первый элемент из очереди на обработку.

В качестве параметра может принимать $lease_time со значением по умолчанию 3600 (1 час). Это количество секунд, за которое ожидается что элемент очереди должен быть обработан. Если за это время элемент не будет обработан, он будет возвращен в очередь и получен при следующем вызове claimItem().

Результат вызова данного метода будет объект, содержащий следующие свойства:

  • data: Содержимое элемента очереди, переданного при помощи createItem().
  • item_id: Уникальный идентификатор элемента очереди, тот что также возвращается в качестве результата вызова createItem().
  • created: Unix timestamp времени создания элемента очереди.

Пример:

$queue_item = $queue->claimItem();
// Do something with $queue_item->data.

deleteItem()

Метод deleteItem() позволяет принудительно удалить элемент из очереди. В качестве аргумента принимает $item полученный при помощи метода claimItem().

Пример:

$queue_item = $queue->claimItem();
$queue->deleteItem($queue_item);
Заметка

Если вы не удалите элемент очереди после его получения, то он обратно вернется в очередь спустя определенное время. См. описание claimItem().

releaseItem()

Метод releaseItem() позволяет принудительно завершить удержание элемента и возвращает его в очередь на повторную обработку. В качестве аргумента принимает $item полученный при помощи метода claimItem(). При успешном снятии элемента с удержания возвращает TRUE, FALSE если что-то пошло не так.

Пример:

$queue_item = $queue->claimItem();
$queue->releaseItem($queue_item);

createQueue()

Метод createQueue() позволяет произвести все необходимые операции необходимые для создания очереди. Вызывается при первой инициализации конкретной очереди.

Пример:

/** \Drupal\Core\Queue\QueueInterface $queue */
$queue = \Drupal::queue('foo');
$queue->createQueue();
Совет

Очереди с хранилищем по умолчанию не требуют вызова данного метода. Они используют общую таблицу queue которая создаётся автоматически по первому требованию.

deleteQueue()

Метод deleteQueue() удаляет очередь и все её оставшиеся элементы.

Пример:

$queue->deleteQueue();

Смотрите также

Ссылки

Помощь и обратная связь

Если вы обнаружили ошибку или хотите внести улучшения, и желаете внести изменения самостоятельно при помощи Pull Request
Если вы желаете предложить улучшение для этого документа

Обратиться за помощью

Если вы не нашли то что искали, воспользуйтесь поиском.

Если вам нужна помощь с чем-то конкретным, обратитесь к сообществу.