Yii2. Queue. Очереди в Yii2.


Работа с очередью — важнейший момент, позволяющий сделать приложение и его работу более простой и быстрой, а саму архитектуру более понятной и распределенной. В этой статье пример работы с расширением 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 секунд, а также будет выводить в консоль информацию о выполнении задач и подсвечивать её цветами.
php yii2 queue очередь на yii2

Также есть команда для мгновенного запуска обработки всех заданий в очереди:

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 на несколько статей.

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

Удачи!

, ,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *