Разработка консольных приложений и автоматизация задач на PHP: старый добрый язык как знакомая замена Bash

«Bash? Беляш? Эммм… Что? Как? По-че-му?» — если именно эти слова произносил ваш внутренний голос, когда вы, начитавшись статей в интернете, решили с помощью Bash автоматизировать ту рутинную задачу, то эта статья для вас. И она ещё более для вас, если вы уже знаете PHP — сейчас вы узнаете также то, что PHP отлично подходит не только для разработки сайтов, но и для консольных приложений.


Предполагается, что вы используете Linux и знаете PHP не ниже начального уровня:


Что такое PHP CLI

Итак, вот как выглядит самое простое приложение на PHP:

<?php
echo "Hello world";

Но его можно запустить не только через браузер, но и через консоль. Если вы разместим этот код в файле с названием hello_world.php:

php hello_world.php

Вывод будет весьма ожидаемым:

Hello world

В консольных PHP приложениях (CLI) вы можете использовать всё то, что и в обычных PHP приложениях, например, записывать и читать файлы функциями file_put_contents и file_get_contents.

Получение аргументов из командной строки

Менее знакомыми для обычных PHP-разработчиков являются функции для работы с командой строкой.

Если вы хотите передать из командой строки какие-либо аргументы в свой скрипт:

php script.php arg1 arg2 arg3

…то прочитать их из PHP можно с помощью глобальной переменной $argv. В данном случае её содержимое будет выглядеть вот так:

array(4) {
  [0]=>
  string(10) "script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}

Заметьте, что значением с индексом 0 всегда является имя запускаемого скрипта. В некоторых случаях для чтения списка аргументов также может быть удобна функция getopt.

Чтение пользовательского ввода

Функция readline создана для запроса пользовательского ввода и используется следующим образом:

$line = readline('Сообщение, которое будет выведено перед запросом');
echo 'Вы ввели: ' . $line;

Выполнение сторонних приложений

Но когда возможностей стандартной библиотеки PHP не хватает, на помощь приходит функция system: с её помощью можно вызывать сторонние приложения.

Если нам, например, нужно стереть с экрана весь предыдущий вывод, то из PHP мы сможем сделать это вот так:

system('clear');

Это выполнит команду clear, как будто вы сами ввели её в консоль.

Форматирование вывода

Конечно, вы не можете выводить HTML-теги функцией echo, как вы делали раньше, и надеяться на отформатированный вывод, но возможность задать базовое оформление всё же остается благодаря так называемым эскейп-последовательностям:

echo "\e[1m жирный \e[0m";
echo "\e[3m курсив \e[0m";
echo "\e[4m нижнее подчеркивание \e[0m";

Полный список вариантов форматирования.

Сокращенное написание

Ура, теперь вы знаете, как делать настоящие консольные приложения на PHP! Но, согласитесь, писать каждый раз

php название_скрипта.php

не очень то весело и даже немножко грустненько.

Но и эту проблему можно решить, просто добавьте в начало файла #!/usr/bin/php, где /usr/bin/php является адресом вашего PHP интерпретатора.

Итоговый файл должен получиться примерно таким:

#!/usr/bin/php
<?php
echo "Меня можно запустить без 'php ' перед моим названием";

Если назвать его myapp (без расширения), то при условии, что вы находитесь в папке с файлом, запустить его можно будет вот так:

myapp

А чтобы запускать ваше консольное приложение из любой существующей, нескольких несуществующих и одной невероятной папки, достаточно просто перенести его в каталог /usr/bin. Например, вот так:

mv myapp /usr/bin/myapp

Небольшой пример реального кода для закрепления знаний: FastAdminer — консольное PHP приложение, в котором используется всё описанное в статье.