PHP в терминале: пишем CLI-утилиты как профи

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

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

Начать курс

PHP — это не только веб: почему ваш следующий CLI-инструмент должен быть написан на PHP

Когда мы слышим «PHP», первая ассоциация — это сайты, WordPress и бесконечные echo в браузере. Но PHP — это настоящий швейцарский нож для разработчика. Одна из его самых недооценённых фишек — возможность создавать полноценные CLI утилиты на PHP. Да-да, те самые консольные программы, которые помогают автоматизировать рутину, парсить логи, генерировать отчёты и делать жизнь DevOps-инженера чуточку проще.

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

Почему PHP для CLI? 3 весомых аргумента

Прежде чем нырнуть в код, давайте разберёмся, зачем вообще использовать PHP для создания CLI утилит. Ведь есть Python, Node.js, Go…

  • Вы уже знаете PHP. Если вы веб-разработчик на PHP, вам не нужно учить новый синтаксис, чтобы написать скрипт для бэкапа базы данных или деплоя.
  • Единая экосистема. Можно использовать те же библиотеки (через Composer), те же ORM и те же шаблонизаторы. Хотите скрипт, который генерирует PDF-отчёт из БД? Пожалуйста.
  • Скорость разработки. PHP-скрипты пишутся очень быстро. Для простых утилит это идеальный вариант — не нужно компилировать, настраивать окружение, просто запустил и поехал.

Конечно, для высоконагруженных демонов или сложных системных утилит лучше взять C или Rust. Но для 90% повседневных задач PHP подходит идеально.

С нуля до первой CLI-утилиты: hello, world! в терминале

Давайте начнём с самого простого. Создайте файл hello.php и напишите:

#!/usr/bin/env php
<?php

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

Первая строка — это shebang. Она говорит системе, что этот файл нужно выполнять с помощью PHP. Без неё вам придётся каждый раз писать php hello.php, а с ней — просто ./hello.php.

Не забудьте дать файлу права на выполнение:

chmod +x hello.php

Теперь запустите:

./hello.php

Поздравляю! Вы только что создали свою первую CLI утилиту на PHP. Это невероятно просто, правда?

Работа с аргументами: делаем утилиту полезной

Любая серьёзная консольная программа должна уметь принимать аргументы. PHP предоставляет для этого два суперглобальных массива: $argv и $argc.

  • $argv — массив аргументов. Первый элемент — имя скрипта.
  • $argc — количество аргументов.

Напишем простой калькулятор — сложим два числа, переданных как аргументы.

Простой калькулятор на PHP CLI

#!/usr/bin/env php
<?php

if ($argc !== 3) {
    echo "Использование: {$argv[0]} <число1> <число2>\n";
    exit(1);
}

$a = (int)$argv[1];
$b = (int)$argv[2];

echo "Сумма: " . ($a + $b) . "\n";
echo "Разность: " . ($a - $b) . "\n";
echo "Произведение: " . ($a * $b) . "\n";
echo "Частное: " . ($a / $b) . "\n";

Запускаем:

./calc.php 10 5

Вывод:

Сумма: 15
Разность: 5
Произведение: 50
Частное: 2

Но это слишком примитивно. В реальных проектах нужны именованные аргументы (флаги), как в git commit -m "message". Для этого в PHP есть функция getopt().

Именованные аргументы с getopt()

#!/usr/bin/env php
<?php

$shortOptions = "u:p:h::";
$longOptions = ["username:", "password:", "host::"];
$options = getopt($shortOptions, $longOptions);

$username = $options['u'] ?? $options['username'] ?? 'guest';
$password = $options['p'] ?? $options['password'] ?? '';
$host = $options['h'] ?? $options['host'] ?? 'localhost';

echo "Подключение к {$host}...\n";
echo "Пользователь: {$username}\n";
echo "Пароль: " . str_repeat('*', strlen($password)) . "\n";

Теперь можно запускать так:

./connect.php -u admin -p secret123 --host=example.com

Или так:

./connect.php --username=root --password=toor

Обратите внимание: если после символа стоит двоеточие (u:), аргумент обязателен. Если два двоеточия (h::), аргумент необязателен.

Цветной вывод: как сделать CLI красивым

Монохромный текст в терминале — это скучно. Давайте добавим цвета. В PHP для этого используются ANSI-escape-последовательности.

Создадим хелпер-класс для цветного вывода:

<?php

class ColorCli
{
    const RESET = "\033[0m";
    const RED = "\033[31m";
    const GREEN = "\033[32m";
    const YELLOW = "\033[33m";
    const BLUE = "\033[34m";
    const MAGENTA = "\033[35m";
    const CYAN = "\033[36m";
    const WHITE = "\033[37m";
    const BOLD = "\033[1m";

    public static function red(string $text): string
    {
        return self::RED . $text . self::RESET;
    }

    public static function green(string $text): string
    {
        return self::GREEN . $text . self::RESET;
    }

    public static function yellow(string $text): string
    {
        return self::YELLOW . $text . self::RESET;
    }

    public static function info(string $text): void
    {
        echo self::BLUE . "[INFO] " . self::RESET . $text . "\n";
    }

    public static function error(string $text): void
    {
        echo self::RED . "[ERROR] " . self::RESET . $text . "\n";
    }

    public static function success(string $text): void
    {
        echo self::GREEN . "[OK] " . self::RESET . $text . "\n";
    }
}

Использова

Блоги

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