Представьте: вы зашли на сайт, нажали кнопку "Отправить", а страница грузится целую минуту. Знакомо? Скорее всего, на сервере выполняется долгая операция: отправка писем, обработка изображений или генерация PDF. Чтобы сайт не зависал, придумали очереди задач. В этой статье разберем, как подключить их в Yii2, и сделаем это без лишней магии.
Что такое очередь задач и зачем она нужна
Очередь задач — это как список дел, который выполняет отдельный работник. Вы кладете задачу в очередь, а специальный обработчик забирает ее и выполняет, когда освободится. Пользователь при этом не ждет — он сразу видит результат, а задача бежит в фоне.
В Yii2 есть расширение yiisoft/yii2-queue. Оно поддерживает разные бэкенды: базу данных, Redis, RabbitMQ, Gearman и другие. Выбирайте то, что удобнее.
Главный плюс — сайт не тормозит. Пользователь не ждет, пока отправятся 100 писем. Он нажал кнопку — и пошел дальше. А письма уходят в фоне.
Установка и настройка: с чего начать
Сначала установим расширение через Composer. Откройте консоль в корне проекта и выполните:
composer require yiisoft/yii2-queue
Теперь нужно настроить компонент в конфигурационном файле. Обычно это config/main.php или config/web.php. Добавьте в секцию components:
'components' => [
'queue' => [
'class' => \yii\queue\db\Queue::class,
'db' => 'db', // компонент базы данных
'tableName' => '{{%queue}}', // имя таблицы
'channel' => 'default', // канал очереди
'mutex' => \yii\mutex\MysqlMutex::class, // блокировка для конкурентного доступа
],
],
Здесь мы используем базу данных как бэкенд. Это просто и не требует установки дополнительных сервисов. Для Redis или RabbitMQ настройка будет похожей, только класс другой.
Создание задачи: пишем свой класс
Задача — это обычный PHP-класс, который реализует интерфейс yii\queue\JobInterface. В нем должен быть метод execute($queue). Внутри пишем логику, которая выполняется в фоне.
Пример задачи для отправки письма:
namespace app\jobs;
use yii\queue\JobInterface;
use Yii;
class MailJob implements JobInterface
{
public $email;
public $subject;
public $body;
public function execute($queue)
{
// Отправляем письмо
Yii::$app->mailer->compose()
->setTo($this->email)
->setSubject($this->subject)
->setTextBody($this->body)
->send();
}
}
Теперь, чтобы поставить задачу в очередь, пишем в контроллере:
Yii::$app->queue->push(new MailJob([
'email' => 'user@example.com',
'subject' => 'Привет',
'body' => 'Это тестовое письмо',
]));
Готово. Пользователь нажал кнопку — письмо ушло в очередь, а не в браузер.
Запуск обработчика: как выполнять задачи
Задачи лежат в очереди, но их нужно обработать. Для этого запускают консольную команду. В Yii2 это делается так:
php yii queue/listen
Эта команда запускает демон, который слушает очередь и выполняет задачи по мере поступления. Можно указать время ожидания и количество попыток.
Параметры запуска:
| Параметр | Описание |
|---|---|
| --timeout | Время ожидания новой задачи (в секундах). По умолчанию 3. |
| --attempts | Количество попыток выполнения, если задача упала с ошибкой. По умолчанию 10. |
| --ttr | Время на выполнение одной задачи (в секундах). Если превышено — задача считается проваленной. |
Пример с параметрами:
php yii queue/listen --timeout=5 --attempts=3
Не забывайте запускать обработчик в фоне, например, через supervisor или systemd. Иначе при закрытии консоли очередь встанет.
Советы по работе с очередями
- Не перегружайте задачу. Одна задача — одна операция. Если нужно отправить 1000 писем, создайте 1000 задач, а не одно письмо с циклом.
- Логируйте ошибки. Внутри
execute()используйтеYii::error(), чтобы знать, что пошло не так. - Используйте разные каналы. Например, канал для писем, канал для генерации отчетов. Тогда можно запускать отдельные обработчики с разными приоритетами.
- Мониторьте очередь. В Yii2 есть встроенные команды для просмотра статуса:
php yii queue/infoпокажет количество задач.
Что в итоге
Очереди задач в Yii2 — это простой способ сделать сайт быстрее и отзывчивее. Вы выносите тяжелые операции в фон, пользователь не ждет, а сервер работает стабильно. Установка занимает 5 минут, а эффект — колоссальный. Начните с базы данных, а потом, если нужно, переходите на Redis или RabbitMQ.
Главное — не бойтесь экспериментировать. Очереди спасут вас от тормозов и головной боли.



