CLI утилиты на PHP: создаём консольные инструменты с нуля

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

CLI утилиты на PHP: почему вы до сих пор не написали свой консольный инструмент?

Представьте: вы сидите в терминале, запускаете одну команду — и через секунду у вас готов отчёт, сконвертированы все картинки или настроен проект на новом сервере. Без браузера, без мыши, без лишних телодвижений. Звучит как магия? Нет, это обычные CLI утилиты на PHP.

Многие разработчики считают PHP только «веб-языком». Но на самом деле PHP — отличный инструмент для создания консольных приложений. У него есть встроенная работа с потоками ввода-вывода, удобная обработка аргументов и, конечно, мощные библиотеки вроде Symfony Console. В этой статье мы разберём, как создать консольный скрипт на PHP с нуля — от простого echo до полноценного инструмента с цветами и прогресс-баром.

Если вы устали от однотипных задач вручную, если хотите автоматизировать рутину и почувствовать себя настоящим хакером — вы по адресу. Поехали!

Что такое CLI утилита и зачем она нужна?

CLI (Command Line Interface) — это программа, которая работает в командной строке. Она принимает аргументы, выполняет действия и выводит результат. В отличие от веб-приложений, здесь нет HTML, CSS и JavaScript. Только чистый код и терминал.

Зачем писать CLI утилиты на PHP? Вот несколько сценариев:

  • Миграции данных — перенос информации из CSV в базу данных.
  • Генерация отчётов — сбор статистики и формирование PDF или Excel.
  • Автоматизация деплоя — развёртывание проекта на сервере одной командой.
  • Парсинг и обработка файлов — конвертация, сжатие, переименование.
  • CRON-задачи — регулярные операции, которые выполняются по расписанию.

И главное — разработка консольных инструментов на PHP не требует сложной инфраструктуры. Достаточно одного файла и нескольких строк кода.

Стартуем: минимальный CLI скрипт на PHP

Откройте терминал, создайте файл hello.php и напишите:

<?php
echo "Привет, терминал!\n";

Запустите:

php hello.php

Вы увидите:

Привет, терминал!

Поздравляю! Вы только что написали свою первую CLI утилиту на PHP. Но давайте сделаем её полезной. Добавим обработку аргументов командной строки.

Работа с аргументами: $argv и $argc

PHP предоставляет два суперглобальных массива для работы с консолью: $argv (список аргументов) и $argc (количество аргументов). Первый аргумент (индекс 0) — это имя самого скрипта.

Пример:

<?php
if ($argc < 2) {
    echo "Использование: php hello.php [имя]\n";
    exit(1);
}

$name = $argv[1];
echo "Привет, $name!\n";

Запуск:

php hello.php Алексей

Результат:

Привет, Алексей!

Уже интересно. Но для серьёзных проектов такой подход неудобен. Нужны именованные аргументы, флаги, значения по умолчанию. Тут на помощь приходит библиотека Symfony Console.

Symfony Console: мощный фундамент для CLI утилит на PHP

Symfony Console — это стандарт де-факто для создания консольных приложений на PHP. С её помощью вы легко добавите:

  • Именованные аргументы и опции
  • Цветной вывод
  • Прогресс-бары
  • Валидацию ввода
  • Автозагрузку команд

Установка через Composer:

composer require symfony/console

Теперь создадим полноценную CLI утилиту на PHP — генератор паролей.

Пишем команду для генерации паролей

Структура проекта:

password-generator/
├── composer.json
├── src/
│   └── GeneratePasswordCommand.php
└── bin/
    └── passgen

Файл composer.json:

{
    "require": {
        "symfony/console": "^6.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

Создаём команду src/GeneratePasswordCommand.php:

<?php
namespace App;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;

class GeneratePasswordCommand extends Command
{
    protected static $defaultName = 'generate:password';

    protected function configure(): void
    {
        $this
            ->setDescription('Генерирует случайный пароль')
            ->addOption('length', 'l', InputOption::VALUE_REQUIRED, 'Длина пароля', 12)
            ->addOption('numbers', null, InputOption::VALUE_NONE, 'Включить цифры')
            ->addOption('symbols', null, InputOption::VALUE_NONE, 'Включить спецсимволы');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $length = (int) $input->getOption('length');
        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

        if ($input->getOption('numbers')) {
            $chars .= '0123456789';
        }
        if ($input->getOption('symbols')) {
            $chars .= '!@#$%^&*()_+-=[]{}|;:,./<>?';
        }

        $password = '';
        $max = strlen($chars) - 1;
        for ($i = 0; $i < $length; $i++) {
            $password .= $chars[random_int(0, $max)];
        }

        $output->writeln("<info>Ваш пароль:</info>");
        $output->writeln("<comment>$password</comment>");

        return Command::SUCCESS;
    }
}

Теперь создадим точку входа bin/passgen:

#!/usr/bin/env php
<?php
require __DIR__ . '/../vendor/autoload.php';

use Symfony\Component\Console\Application;
use App\GeneratePasswordCommand;

$app = new Application('Генератор парол                

Блоги

Рекомендаций по книгам