Представьте: вы зашли на сайт, нажали кнопку "Отправить", а страница грузится целую минуту. Знакомо? Скорее всего, на сервере выполняется долгая операция: отправка писем, обработка изображений или генерация 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 настройка будет похожей, только класс другой.

Лайфхак: Если сайт маленький, используйте базу данных. Если ожидаете много задач — 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.

Главное — не бойтесь экспериментировать. Очереди спасут вас от тормозов и головной боли.

Студия WNDER