Очереди (англ. 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();
¶Смотрите также
¶Ссылки
- Drupal 8: Queue API, Niklan, 2015
- Drupal 8: Плагин QueueWorker — выполнение очередей по крону, Niklan, 2019