«Bash? Беляш? Эммм… Что? Как? По-че-му?» — если именно эти слова произносил ваш внутренний голос, когда вы, начитавшись статей в интернете, решили с помощью Bash автоматизировать ту рутинную задачу, то эта статья для вас. И она ещё более для вас, если вы уже знаете PHP — сейчас вы узнаете также то, что PHP отлично подходит не только для разработки сайтов, но и для консольных приложений.
Предполагается, что вы используете Linux и знаете PHP не ниже начального уровня:
https://tproger2.azureedge.net/wp-content/uploads/2016/09/original-300x156.jpg 300w, https://tproger2.azureedge.net/wp-content/uploads/2016/09/original-1024x534.jpg 1024w" sizes="(max-width: 1400px) 100vw, 1400px" style="box-sizing: border-box; -webkit-font-smoothing: antialiased; max-width: 100%; height: auto; vertical-align: middle;">
Что такое PHP CLI
Итак, вот как выглядит самое простое приложение на PHP:
|
1
2
|
<?php
echo"Hello world";
|
Но его можно запустить не только через браузер, но и через консоль. Если вы разместим этот код в файле с названием hello_world.php:
|
1
|
php hello_world.php
|
Вывод будет весьма ожидаемым:
|
1
|
Hello world
|
В консольных PHP приложениях (CLI) вы можете использовать всё то, что и в обычных PHP приложениях, например, записывать и читать файлы функциями file_put_contents иfile_get_contents.
Получение аргументов из командной строки
Менее знакомыми для обычных PHP-разработчиков являются функции для работы с командой строкой.
Если вы хотите передать из командой строки какие-либо аргументы в свой скрипт:
|
1
|
php script.php arg1 arg2 arg3
|
…то прочитать их из PHP можно с помощью глобальной переменной $argv. В данном случае её содержимое будет выглядеть вот так:
|
1
2
3
4
5
6
7
8
9
10
|
array(4){
[0]=>
string(10)"script.php"
[1]=>
string(4)"arg1"
[2]=>
string(4)"arg2"
[3]=>
string(4)"arg3"
}
|
Заметьте, что значением с индексом 0 всегда является имя запускаемого скрипта. В некоторых случаях для чтения списка аргументов также может быть удобнафункция getopt.
Чтение пользовательского ввода
Функция readline создана для запроса пользовательского ввода и используется следующим образом:
|
1
2
|
$line=readline('Сообщение, которое будет выведено перед запросом');
echo'Вы ввели: '.$line;
|
Выполнение сторонних приложений
Но когда возможностей стандартной библиотеки PHP не хватает, на помощь приходит функция system: с её помощью можно вызывать сторонние приложения.
Если нам, например, нужно стереть с экрана весь предыдущий вывод, то из PHP мы сможем сделать это вот так:
|
1
|
system('clear');
|
Это выполнит команду clear, как будто вы сами ввели её в консоль.
Форматирование вывода
Конечно, вы не можете выводить HTML-теги функцией echo, как вы делали раньше, и надеяться на отформатированный вывод, но возможность задать базовое оформление всё же остается благодаря так называемым эскейп-последовательностям:
|
1
2
3
|
echo"\e[1m жирный \e[0m";
echo"\e[3m курсив \e[0m";
echo"\e[4m нижнее подчеркивание \e[0m";
|
Полный список вариантов форматирования.
Сокращенное написание
Ура, теперь вы знаете, как делать настоящие консольные приложения на PHP! Но, согласитесь, писать каждый раз
|
1
|
phpназвание_скрипта.php
|
не очень то весело и даже немножко грустненько.
Но и эту проблему можно решить, просто добавьте в начало файла #!/usr/bin/php, где/usr/bin/php является адресом вашего PHP интерпретатора.
Итоговый файл должен получиться примерно таким:
|
1
2
3
|
#!/usr/bin/php
<?php
echo"Меня можно запустить без 'php ' перед моим названием";
|
Если назвать его myapp (без расширения), то при условии, что вы находитесь в папке с файлом, запустить его можно будет вот так:
|
1
|
myapp
|
А чтобы запускать ваше консольное приложение из любой существующей, нескольких несуществующих и одной невероятной папки, достаточно просто перенести его в каталог /usr/bin. Например, вот так:
|
1
|
mv myapp/usr/bin/myapp
|
Небольшой пример реального кода для закрепления знаний: FastAdminer — консольное PHP приложение, в котором используется всё описанное в статье.
