Планировщик задач — это как будильник для вашего приложения. Без него рутинные операции (рассылки, очистка кэша, синхронизация данных) придётся запускать вручную. В Yii2 есть всё для автоматизации: консольные команды, расширения и даже встроенный планировщик. В этой статье разберём, как настроить крон и не наступить на грабли.

Digital-студия WNDER

Зачем вообще нужен планировщик в Yii2?

Представьте: у вас интернет-магазин. Нужно каждую ночь обновлять остатки товаров, отправлять письма брошенным корзинам, чистить логи. Делать это вручную — безумие. Крон (cron) — это системная утилита в Unix-подобных ОС, которая запускает скрипты по расписанию. В Yii2 мы можем создавать консольные команды и вызывать их из крона. Или использовать встроенный планировщик, который сам управляет расписанием.

Главная задача — сделать так, чтобы задачи запускались вовремя и не мешали друг другу. И тут есть несколько подходов.

Создаём консольную команду

В Yii2 консольные команды живут в папке commands (или console/controllers в продвинутом шаблоне). Создадим простую команду для очистки кэша.

cache->flush()) {
            echo "Кэш очищен!\n";
            return 0;
        }
        echo "Не удалось очистить кэш.\n";
        return 1;
    }
}

Теперь можно запустить команду вручную: yii cache/clear. Это уже шаг вперёд. Но как сделать, чтобы она работала сама?

Настройка системного крона

Самый простой путь — добавить задание в системный крон. Откройте терминал и введите crontab -e. Добавьте строку вроде:

0 2 * * * /usr/bin/php /path/to/yii cache/clear >> /var/log/yii-cache.log 2>&1

Это значит: каждый день в 2 часа ночи выполнить команду yii cache/clear и записать вывод в лог. Удобно, но есть минусы: если задач много, crontab превращается в свалку. К тому же, если серверов несколько, придётся дублировать настройки. И не забудьте про окружение — на продакшене и разработке пути разные.

Правило: Всегда указывайте полный путь к PHP и к файлу yii. Иначе крон может не найти интерпретатор.

Планировщик задач в Yii2: расширения и встроенные возможности

В Yii2 нет встроенного планировщика «из коробки», но есть популярные расширения, например, yiisoft/yii2-scheduler или omnilight/yii2-scheduling. Они позволяют описывать расписание прямо в коде на PHP. Это удобнее, чем писать crontab-строки: расписание хранится в репозитории, легко версионируется.

Рассмотрим omnilight/yii2-scheduling. Установите через Composer:

composer require omnilight/yii2-scheduling

Затем настройте компонент в конфиге:

'components' => [
    'scheduler' => [
        'class' => 'omnilight\scheduling\Scheduler',
        'tasks' => [
            [
                'command' => 'cache/clear', // консольная команда
                'cron' => '0 2 * * *', // каждый день в 2 ночи
            ],
            [
                'command' => 'mail/send-newsletter',
                'cron' => '0 9 * * 1', // каждый понедельник в 9 утра
            ],
        ],
    ],
],

Теперь достаточно добавить в системный крон одну строку, которая запускает сам планировщик:

* * * * * /usr/bin/php /path/to/yii scheduler/run >> /var/log/yii-scheduler.log 2>&1

Планировщик каждую минуту проверяет, какие задачи пора выполнить, и запускает их. Красота! Расписание хранится в конфиге, а не в crontab.

Сравнение подходов: что выбрать?

Давайте сравним два способа организации планирования в Yii2.

Критерий Системный крон Планировщик Yii2
Гибкость Высокая (можно любые команды) Ограничена возможностями расширения
Управление версиями Нет (crontab на сервере) Да (расписание в коде)
Простота Просто для одной задачи Требует установки расширения
Логирование Настраивается вручную Встроенное (через Yii::info)

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

Лайфхаки и подводные камни

  • Блокировка задач. Если задача выполняется дольше, чем интервал запуска, крон может запустить её повторно. Используйте мьютексы (например, через yii\mutex\Mutex или файловые блокировки).
  • Окружение. На продакшене и разработке разные пути и настройки. Выносите параметры в конфиг.
  • Логирование. Всегда пишите логи выполнения задач. Иначе потом не разберётесь, почему письма не ушли.
  • Тестирование. Запускайте команды вручную перед добавлением в крон. Убедитесь, что они работают из консоли.
Лайфхак: Для отладки расписания используйте команду yii scheduler/run --dry-run (если поддерживается расширением) — она покажет, какие задачи были бы запущены, но не выполнит их.

Что в итоге?

Планирование задач в Yii2 — это не магия, а комбинация консольных команд и планировщика. Системный крон прост, но неудобен для сложных расписаний. Расширения вроде omnilight/yii2-scheduling дают гибкость и порядок в коде. Главное — не забывайте про блокировки, логирование и тестирование. И тогда ваш «будильник» будет работать как часы.

Начните с малого: создайте одну команду и запустите её через крон. Убедитесь, что всё работает. А потом переходите на планировщик — сэкономите нервы и время.

Студия WNDER