Планировщик задач — это как будильник для вашего приложения. Без него рутинные операции (рассылки, очистка кэша, синхронизация данных) придётся запускать вручную. В Yii2 есть всё для автоматизации: консольные команды, расширения и даже встроенный планировщик. В этой статье разберём, как настроить крон и не наступить на грабли.
Зачем вообще нужен планировщик в 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 превращается в свалку. К тому же, если серверов несколько, придётся дублировать настройки. И не забудьте про окружение — на продакшене и разработке пути разные.
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 дают гибкость и порядок в коде. Главное — не забывайте про блокировки, логирование и тестирование. И тогда ваш «будильник» будет работать как часы.
Начните с малого: создайте одну команду и запустите её через крон. Убедитесь, что всё работает. А потом переходите на планировщик — сэкономите нервы и время.
