Работа с очередью — важнейший момент, позволяющий сделать приложение и его работу более простой и быстрой, а саму архитектуру более понятной и распределенной. В этой статье пример работы с расширением yii2-queue, т.е. работой с очередями в Yii2.
Работа с очередью может быть использована при всех времязатратных операциях, а также работе с внешними ресурсами — например, отправка почты, общение со сторонними API, генерация PDF-файлов и т.д. Сфер применения — множество.
Итак, от слов — к делу. Работаем с расширением yii2-queue.
Сначала, как всегда устанавливаем:
composer require --prefer-dist yiisoft/yii2-queue
Я приведу пример работы с DB-драйвером. При желании и необходимости его можно заменить на другой из коробки (синхронный, файловы, Redis, RabbitMQ и т.д.) или написать свой.
1. Добавляем таблицу для работы с компонентом (MySQL):
CREATE TABLE `queue` ( `id` int(11) NOT NULL AUTO_INCREMENT, `channel` varchar(255) NOT NULL, `job` blob NOT NULL, `pushed_at` int(11) NOT NULL, `ttr` int(11) NOT NULL, `delay` int(11) NOT NULL DEFAULT 0, `priority` int(11) unsigned NOT NULL DEFAULT 1024, `reserved_at` int(11) DEFAULT NULL, `attempt` int(11) DEFAULT NULL, `done_at` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `channel` (`channel`), KEY `reserved_at` (`reserved_at`), KEY `priority` (`priority`) ) ENGINE=InnoDB
ВАЖНО! Если вы используете tablePrefix — не забудьте добавить его к имени таблицы.
2. Далее, для подключения расширения следует добавить в конфигурацию приложения его компонент (/common/main.php).
'queue' => [
'class' => \yii\queue\db\Queue::class,
'db' => 'db', // компонент подключения к БД
'tableName' => '{{%queue}}', // Имя таблицы
'channel' => 'default', // Queue channel key
'mutex' => \yii\mutex\MysqlMutex::class, // Mutex used to sync queries
]
Также следует добавить компонент в bootstrap (в этом же файле):
'bootstrap' => ['log', 'queue'],
ВАЖНО! В зависимости от начальной конфигурации Вашего приложения может быть необходимость провести пункты выше отдельно для console и backend|frontend.
3. Компонент подключен. Запускаем прослушку очереди:
yii queue/listen 5 -v --color
Код выше запустит процесс проверки наличия заданий в очереди с интервалом в 5 секунд, а также будет выводить в консоль информацию о выполнении задач и подсвечивать её цветами.

Также есть команда для мгновенного запуска обработки всех заданий в очереди:
yii queue/run
4. Добавление заданий в очередь:
Одно задание — один файл, имплементящий \yii\queue\Job.
Пример такого файла ниже:
file, $this->text);
}
}
Согласно интерфейсу, класс должен иметь метод execute, который, собственно и является выполнением задания.
И наконец-то, само добавление задания в очередь:
\Yii::$app->queue->push(new backend\jobs\WriteJob([
'text' => 'test',
'file' => \Yii::getAlias('@vendor').'\queue.dat'
]));
В метод push следует передать экземпляр нашего класса, при этом, в случае необходимости, также передать те параметры, которые объявлены public-ами в job-е.
В самом простом виде — это полный алгоритм начала работы с очередями. Расширение, с которым мы работаем имеет множество возможностей — мы можем программно запускать обработку очереди, проверять состояние заданий по их id, добавлять информацию о заданиях в debug-toolbar и т.д.
Но описать весь функционал в рамках одной статьи не является возможным, поэтому я разобью описание работы с очередями на Yii2 на несколько статей.
Надеюсь статья была полезной и я ничего не упустил. В случае вопросов — добро пожаловать в комментарии внизу страницы.
Удачи!