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";
}
}
Использова