Пишем консольное (CLI) приложение на PHP. Часть 1.

В этой статье мы разберемся что такое консольные (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» в начале.

Ну а на этом все, надеюсь эта статья была вам полезна. А если у вас возникли вопросы — вы можете задать их в комментариях)