Каждый разработчик сталкивался с рутинными задачами: очистка кэша, отправка email, обработка данных по расписанию. Yii2 предлагает элегантное решение — консольные команды. В этой статье разберём, как их создавать и использовать для автоматизации.
Что такое консольные команды в Yii2?
Консольные команды — это скрипты, которые запускаются из терминала. В Yii2 они реализованы через контроллеры, наследующие yii\console\Controller. Такие команды могут выполняться вручную или по расписанию (cron).
Зачем это нужно? Представьте: каждый день в 3 часа ночи нужно чистить логи. Вместо того чтобы просыпаться и делать это вручную, вы пишете команду и настраиваете cron. Красота!
Создание первой команды
Для начала убедимся, что в проекте есть директория commands (обычно она уже создана в базовом шаблоне). Если нет — создайте.
Теперь создадим файл commands/HelloController.php:
<?php
namespace app\commands;
use yii\console\Controller;
class HelloController extends Controller
{
public function actionIndex($name = 'World')
{
echo "Hello, $name!\n";
return 0; // код возврата 0 означает успех
}
}
Запустим команду из терминала:
php yii hello/index --name=Yii
Вы увидите: Hello, Yii!. Поздравляю, вы только что создали свою первую консольную команду!
Параметры и опции команд
Команды могут принимать аргументы и опции. Аргументы — позиционные, опции — именованные (с префиксом --).
Пример команды с аргументами и опциями:
<?php
namespace app\commands;
use yii\console\Controller;
class UserController extends Controller
{
public function actionCreate($username, $email, $admin = false)
{
// Логика создания пользователя
echo "Создан пользователь: $username, email: $email" . ($admin ? ' (админ)' : '') . "\n";
return 0;
}
}
Запуск:
php yii user/create john john@example.com --admin=1
Yii2 автоматически преобразует --admin=1 в boolean true.
Вот основные типы параметров:
| Тип | Пример | Описание |
|---|---|---|
| Аргумент | php yii user/create john |
Обязательный или опциональный позиционный параметр |
| Опция | --admin=1 |
Именованный параметр, может иметь значение по умолчанию |
| Флаг | --verbose |
Без значения, просто наличие означает true |
Продвинутые возможности
Yii2 предлагает множество инструментов для улучшения консольных команд:
- Форматированный вывод: используйте
$this->stdout()и$this->stderr()для цветного текста. - Интерактивный ввод: методы
prompt(),confirm()для диалога с пользователем. - Прогресс-бар:
$this->startProgress()и$this->updateProgress()для длительных операций. - Миграции и другие встроенные команды: можно вызывать другие команды через
$this->run().
Пример с прогресс-баром:
<?php
public function actionImport()
{
$total = 100;
$this->startProgress($total);
for ($i = 0; $i < $total; $i++) {
// Имитация работы
usleep(100000);
$this->updateProgress($i + 1);
}
$this->endProgress();
return 0;
}
$this->interactive для проверки, запущена ли команда в интерактивном режиме. Если нет — не задавайте вопросы, используйте значения по умолчанию.
Автоматизация через cron
Чтобы команда выполнялась по расписанию, добавьте её в crontab. Например, каждый день в 2 часа ночи:
0 2 * * * /usr/bin/php /path/to/project/yii hello/index --name=Night
Убедитесь, что путь к PHP и проекту правильный. Для отладки можно перенаправлять вывод в файл:
0 2 * * * /usr/bin/php /path/to/project/yii hello/index --name=Night >> /var/log/mycommand.log 2>&1
Так вы сможете отслеживать ошибки.
Заключение
Консольные команды в Yii2 — мощный инструмент для автоматизации. Они просты в создании, гибки в настройке и легко интегрируются с cron. Начните с малого: автоматизируйте очистку кэша или отправку отчётов. Постепенно вы оцените, сколько времени они экономят.
Помните: хорошая команда должна возвращать корректный код завершения, обрабатывать ошибки и быть понятной. Экспериментируйте, и ваши рутинные задачи станут историей.
Студия WNDER

