В этой статье мы разберемся что такое консольные (CLI) приложения. Напишем простейшее CLI приложение. Реализуем получение аргументов приложения с помощью переменной $argv.
Что такое PHP CLI
В большинстве случаев php используется для обработки HTTP запросов. Однако таким образом можно решить далеко не все задачи более-менее сложного веб-приложения. Например, нам может потребоваться выполнять email рассылку или время от времени вносить изменения в базу данных. В таком случае, если продолжать использовать клиент-серверный подход, администратору сайта придется раз в день переходить по определенному адресу для запуска php скрипта, что, согласитесь, не очень удобно.
Для решения этой задачи, начиная с PHP 4.3 (в 2002 году), появилась официальная поддержка режима CLI. Это значит, что теперь php можно использовать для написания консольных программ, которые читают вводимые команды и выполняют запрошенные действия.
Первая CLI программа на PHP
Теперь давайте посмотрим как создавать такие программы. Для этого, конечно, должен быть установлен интерпретатор php. Более подробно процесс его установки мы рассмотрели в этой статье.
Для примера, напишем самое простое приложение на php. Для этого создадим файл cli.php и запишем в него следующее содержимое:
<?php
echo 'Digital-Blog';
При обычном, клиент-серверном подходе, такое приложение выводит на экран браузера: Digital-Blog. Но теперь, мы попробуем запустить его в консоли. Для этого, откроем стандартный интерпретатор командной строки. В моем случае (Windows) это cmd.exe. Затем, перейдем в директорию с файлом cli.php и выполним команду:
php cli.php
Вывод будет следующим:
shell>php cli.php
Digital-Blog
Это значит, что наше приложение успешно выполнилось.
Получение аргументов с помощью $argv
При вызове программы также можно указать аргументы командной строки — это необязательные строковые параметры, передаваемые операционной системой в программу при её запуске. В PHP их содержит глобальная переменная $argv в виде ассоциативного массива. Давайте изменим содержимое файла cli.php на:
<?php
print_r($argv);
Теперь, запустим нашу программу, указав несколько аргументов:
php cli.php a b c
Мы получим следующий вывод:
shell>php cli.php a b c
Array
(
[0] => cli.php
[1] => a
[2] => b
[3] => c
)
Как видите, значение с нулевым индексом это название нашего файла, а дальше идут аргументы командной строки. Теперь напишем программу, которая, в случае наличия аргумента «a», будет выводить «OK»:
<?php
if (in_array("a", $argv)) echo 'OK';
Для проверки, сначала запустим программу без аргумента «a», а потом добавим его:
shell>php cli.php
shell>php cli.php a
OK
Получение значений аргументов с помощью $argv
Таким образом, мы можем только проверить наличие определенного аргумента. Для получения его значения, нам придется написать простой парсер, который будет представлять аргументы функции в виде ассоциативного массива. Его индексами будут являться имена аргументов, а значения будут значениями аргументов:
<?php
$parsed_args = array();
for ($i = 1; $i < count($argv); $i++) {
if (preg_match('/^--?([^-=\s]+)=([^=\s]+)/', $argv[$i], $match)) {
$parsed_args[$match[1]] = $match[2];
}
}
print_r($parsed_args);
Теперь мы можем указывать значения аргументов через знак «=». Например, запустим эту программу с аргументом «-a», которому присвоим значение «test».
shell>php cli.php -a=test
Array
(
[a] => test
)
Также, мы можем указать несколько аргументов:
shell>php cli.php -a=1 -b=2 -c=3
Array
(
[a] => 1
[b] => 2
[c] => 3
)
В приведенной выше программе, массив $argv перебирается со второго элемента циклом for. Каждый элемент проверяется на соответствие регулярному выражению. Если он соответствует, то символы между «—» и «=» записываются в индекс элемента ассоциативного массива $parsed_args, а символы после «=» в его значение. После этого массив $parsed_args выводится в консоль.
В следующих частях мы рассмотрим более простой способ получения значений аргументов, будем обрабатывать пользовательский ввод и форматировать вывод нашей программы. А также научимся запускать приложение без «php» в начале.
Ну а на этом все, надеюсь эта статья была вам полезна. А если у вас возникли вопросы — вы можете задать их в комментариях)