В 11-ом уроке мы разберемся с одной из недооцененных возможностей Yii 2, это консольными командами. Если вы хотите автоматизировать рутинные задачи, импортировать данные или запускать скрипты по расписанию, этот урок станет вашим надежным руководством.
Создание консольных команд
Консольные команды в Yii 2 это специальные классы, которые позволяют выполнять задачи через командную строку. Они идеально подходят для фоновых процессов, таких как обработка данных, отправка рассылок или генерация отчетов.
Как это работает?
Все консольные команды хранятся в папке commands вашего проекта. Каждая команда это класс, унаследованный от yii\console\Controller. Для начала создадим простейшую команду.
- Создаем класс команды:
Создайте файлHelloController.phpв директорииcommands:namespace app\commands; use yii\console\Controller; class HelloController extends Controller { public function actionIndex($message = 'Привет, мир!') { echo $message . "\n"; } }
Здесь
actionIndexэто действие по умолчанию. - Регистрируем команду:
Добавьте команду вconfig/console.php:'controllerMap' => [ 'hello' => 'app\commands\HelloController', ],
- Запускаем команду:
Выполните в консоли:php yii hello
Вы увидите: Привет, мир!.
Практическая задача
Создайте команду TestController, которая выводит в консоль текущую дату.
Подсказка: Используйте date('Y-m-d H:i:s').
Пример: импорт данных из CSV-файла
Консольные команды отлично подходят для обработки данных. Давайте реализуем импорт товаров из CSV-файла в базу данных.
Шаг 1: Подготовка модели
Предположим, у нас есть модель Product:
namespace app\models; use yii\db\ActiveRecord; class Product extends ActiveRecord { public static function tableName() { return 'products'; } }
Шаг 2: Создаем команду импорта
Создайте ImportController.php в commands:
namespace app\commands; use yii\console\Controller; use yii\console\ExitCode; use app\models\Product; class ImportController extends Controller { public function actionProducts($filename) { if (!file_exists($filename)) { $this->stderr("Файл не найден: $filename\n"); return ExitCode::NOINPUT; } $handle = fopen($filename, 'r'); $header = fgetcsv($handle, 1000, ','); // Читаем заголовки while (($row = fgetcsv($handle, 1000, ',')) !== false) { $data = array_combine($header, $row); $product = new Product(); $product->attributes = $data; if (!$product->save()) { $this->stderr("Ошибка при сохранении товара: " . print_r($product->errors, true)); } } fclose($handle); $this->stdout("Импорт завершен!\n"); return ExitCode::OK; } }
Шаг 3: Запуск импорта
Поместите CSV-файл в папку runtime и выполните:
php yii import/products runtime/products.csv
Практическая задача
Доработайте команду: добавьте проверку на дубликаты по полю sku и прогресс-бар.
Пример прогресс-бара:
$totalRows = count(file($filename)) - 1; // Минус заголовок $this->startProgress(0, $totalRows); // В цикле: $this->updateProgress($currentRow, $totalRows);
Планирование задач через cron
Консольные команды бесполезны, если их запускать вручную. Настроим автоматический запуск через cron.
Настройка cron на сервере
- Откройте cron-таблицу:
crontab -e
- Добавьте задание:
* * * * * /usr/bin/php /var/www/project/yii import/products /var/www/project/runtime/products.csv > /dev/null 2>&1
Здесь:
* * * * *задача выполняется каждую минуту./usr/bin/phpпуть к PHP (уточните черезwhich php).> /dev/nullперенаправление вывода, чтобы не засорять логи.
Практическая задача
Настройте cron для запуска команды hello каждые 5 минут.
Передача аргументов и параметров в команды
Консольные команды могут принимать аргументы и опции.
Аргументы или Параметры
- Аргументы передаются в порядке объявления.
- Параметры (опции) задаются через
--ключ=значение.
Пример команды с аргументами и параметрами
Модифицируем ImportController:
class ImportController extends Controller { public $email; // Параметр public function options($actionID) { return ['email']; // Разрешаем опцию --email } public function actionProducts($filename, $categoryId = null) { // Аргумент: $filename // Опциональный аргумент: $categoryId // Параметр: --email=admin@site.ru if ($this->email) { // Отправляем отчет на email } } }
Запуск:
php yii import/products runtime/products.csv 5 --email=admin@site.ru
Вы научились их создавать, импортировать данные, работать с cron и передавать параметры.
Полный курс с уроками по Yii 2 для начинающихпо ссылке: https://max-gabov.ru/yii-2-dlya-nachinaushih
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


