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

Digital-студия WNDER

Что такое консольные команды в 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!. Поздравляю, вы только что создали свою первую консольную команду!

Правило: Всегда возвращайте код завершения (0 — успех, 1 — ошибка). Это помогает автоматизации и мониторингу.

Параметры и опции команд

Команды могут принимать аргументы и опции. Аргументы — позиционные, опции — именованные (с префиксом --).

Пример команды с аргументами и опциями:

<?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