CLI фреймворки для PHP: от простых скриптов к профессиональным консольным приложениям
Консольные приложения (CLI — Command Line Interface) остаются неотъемлемой частью современной разработки. Они используются для автоматизации задач, обработки данных, миграций, запуска тестов и администрирования серверов. PHP, несмотря на свою репутацию «веб-языка», предоставляет отличные возможности для создания мощных CLI-инструментов. В этой статье мы рассмотрим лучшие фреймворки и библиотеки для разработки консольных приложений на PHP, которые помогут вам перейти от простых скриптов к структурированным, тестируемым и масштабируемым решениям.
Зачем использовать CLI фреймворк вместо простого скрипта?
Написание консольного скрипта «с нуля» кажется простым, но быстро приводит к проблемам:
- Обработка аргументов: разбор
$argvи$argcвручную — утомительно и подвержено ошибкам. - Вывод информации: цвета, прогресс-бары, таблицы — всё это требует отдельной реализации.
- Структура кода: сложно организовать несколько команд в одном файле.
- Тестирование: консольные скрипты сложно тестировать без специальных инструментов.
Использование фреймворка решает эти проблемы и даёт готовую архитектуру, DI-контейнер, систему событий и интеграцию с популярными библиотеками.
Symfony Console — золотой стандарт
Symfony Console — это компонент экосистемы Symfony, который стал де-факто стандартом для создания CLI-приложений на PHP. Он используется в Laravel (через Artisan), Doctrine, Composer и многих других проектах.
Установка и базовый пример
composer require symfony/console
Создадим простую команду, которая приветствует пользователя:
<?php
// greet.php
require __DIR__ . '/vendor/autoload.php';
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
class GreetCommand extends Command
{
protected static $defaultName = 'app:greet';
protected function configure(): void
{
$this->setDescription('Приветствует пользователя')
->addArgument('name', InputArgument::REQUIRED, 'Имя пользователя');
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$name = $input->getArgument('name');
$output->writeln("Привет, <info>$name</info>!");
return Command::SUCCESS;
}
}
$application = new Application();
$application->add(new GreetCommand());
$application->run();
Запуск: php greet.php app:greet Иван выведет Привет, Иван! с зелёным цветом.
Основные возможности Symfony Console
- Автоматическая генерация справки: команда
listиhelpработают «из коробки». - Типы аргументов и опций: обязательные/необязательные, массивы, значения по умолчанию.
- Форматирование вывода: теги
<info>,<comment>,<error>для цвета. - Прогресс-бары и таблицы: встроенные классы
ProgressBarиTable. - Поддержка вопросов: интерактивный ввод через
QuestionHelper. - События и жизненный цикл: можно перехватывать выполнение команды.
Пример с прогресс-баром
use Symfony\Component\Console\Helper\ProgressBar;
protected function execute(InputInterface $input, OutputInterface $output): int
{
$progressBar = new ProgressBar($output, 50);
$progressBar->start();
for ($i = 0; $i < 50; $i++) {
usleep(100000); // имитация работы
$progressBar->advance();
}
$progressBar->finish();
$output->writeln('');
return Command::SUCCESS;
}
Laravel Zero — микрофреймворк для CLI
Laravel Zero — это ответвление Laravel, оптимизированное для создания консольных приложений. Оно включает Eloqu
Также в библиотеке
Event Bus и паттерн Observer в Go (Golang): реализация pub/sub
Elasticsearch клиент для PHP: elasticsearch-php — полное руководство
gomock для Go: полное руководство с примерами
Планировщик задач на Go (Golang): cron, gocron и asynq
Обработка изображений в Java: библиотеки, инструменты и примеры кода