Очереди

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

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

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

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

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

Работа с очередями осуществляется при помощи сервиса 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);

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();

deleteQueue()

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

Пример:

$queue->deleteQueue();

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

Ссылки

🌱 Помогите нам сделать документацию лучше!

Вся документация Druki с отрытым исходным кодом. Нашли ошибку или неточность? Создайте pull request.

Редактировать текущий документ Обсудить улучшение

Или узнайте как контрибутить.

🤔 По-прежнему нужна помощь?

Не нашли ответа на свой вопрос? Попросите помощи у сообщества!

Задайте вопрос на GitHub Смотрите другие ресурсы сообщества