php работа с командной строкой
Php работа с командной строкой
Существенные отличия CLI SAPI от других SAPI :
Хотя в CGI SAPI имеется способ подавления HTTP-шапок, эквивалентного переключателя для их включения в CLI SAPI нет.
Примечание: эти директивы не могут быть инициализированы другим значением из файла конфигурации php.ini или специального файла (если специфицирован). Это является некоторым ограничением, поскольку эти значения по умолчанию применяются после разбора всех файлов конфигурации. Однако их значение может быть изменено на этапе прогона программы (что не имеет смысла для всех других директив, например, для register_argc_argv).
Легче работать в среде оболочки, когда определены следующие константы:
Таблица 24-2. Специфические CLI-константы
Вам не нужно явно закрывать эти потоки, это делается РНР автоматически.
CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта!
Пример, показывающий отличие CGI SAPI :
Это ясно показывает, что PHP изменяет свою текущую директорию на директорию исполняемого скрипта.
Использование CLI SAPI даёт:
Сказать PHP выполнить определённый файл.
Передать PHP код для выполнения непосредственно из командной строки.
Особого внимания требует замена переменных оболочки и использование кавычек.
Вы не можете комбинировать эти три способа при выполнении кода.
Приняв, что файл называется test и находится в текущей директории, мы можем выполнить:
Таблица 24-3. Опции командной строки
Отображать синтаксис в цвете.
Отобразить исходный текст без комментариев и пробелов.
Разбирает и выполняет данный файл. Этот переключатель является необязательным и может быть опущен. Достаточно предоставить имя файла для выполнения.
Записывает PHP, PHP SAPI и Zend-версии в стандартный вывод, например:
Запускает PHP интерактивно.
Генерирует расширенную информацию для debugger/profiler.
Пример, выводящий ошибку разборщика:
Если вы используете оболочку/shell иначе, чем sh/bash, у вас могут появиться новые вопросы. Отправляйте bug report или mail по адресу phpdoc@lists.php.net. Можно легко столкнуться с проблемами при попытке получить переменные оболочки в коде или использовании обратных слэшей (/) для замен/escaping.
Вы предупреждены.
Пример 24-1. Скрипт, предназначенный для запуска из командной строки (script.php)
Пример 24-2. Пакетный/Batch-файл для запуска PHP-скрипта в командной строке (script.bat)
См. также в документации по расширению Readline о функциях, которые можно использовать для усовершенствования вашего РНР-приложения для командной строки.
Command Line Interface в PHP
До этого момента мы с Вами знали, что PHP работает на сервере. Клиент обращается к серверу по протоколу HTTP с каким-либо запросом, запрос на сервере обрабатывается и формируется ответ. После этого клиенту снова по протоколу HTTP в ответе отдаётся сформированный ответ. Однако, если взять какой-нибудь более-менее продвинутый сайт, то мы увидим, что есть задачи, которые не решаются стандартным клиент-серверным путем. Например: поздравлять пользователей с днём рождения и дарить им скидку на какой-нибудь продукт. Для того, чтобы это сделать, нам придется обновлять раз в день php-скрипт в браузере, чтобы он выбирал пользователей, у которых сегодня ДР, затем создавал для них скидки, и отправлял им сообщения по почте. Согласитесь, неудобно это делать вручную и в браузере. Для таких случаев в PHP предусмотрен Command Line Interface (CLI) – интерфейс командной строки.
CLI позволяет запускать программы на PHP не через привычную нам клиент-серверную архитектуру, а как простые программы в командной строке. Давайте создадим простейший скрипт, чтобы показать, как это работает. Создаём новую папку bin в корне проекта, а в ней файл – cli.php.
Пишем простейший код:
А теперь запускаем консоль из OpenServer:
Переходим в папку с нашим проектом, выполнив:
И пишем следующую команду:
Написали простейшее консольное приложение! Уже неплохо. Но что если мы захотим сложить 2 числа, которые нужно передать скрипту? Как Вы понимаете, сделать это с помощью GET- или POST- запросов уже не получится. Так как же быть?
Аргументы консольного приложения
На помощь нам приходят аргументы, которые мы можем передать в скрипт, указав их после имени скрипта в командной строке. Вот так:
Давайте теперь запустим наш скрипт с параметрами:
Как видим, наши аргументы попали в этот массив. Давайте напишем простейший скрипт, который будет складывать все переданные ему аргументы.
Запустим его, и убедимся, что все работает:
И он действительно работает: 3 + 4 + 5 = 12.
А что если мы хотим передавать аргументы с именами? Вроде такого:
И затем в коде получать их в коде по их именам? Для этого нам следует написать простейший парсер, который будет находить вот такие именованные параметры и их значения. Пишем.
И проверяем его работу:
Отлично, теперь мы можем обращаться к элементам массива params, чтобы выяснить, были ли нам переданы какие-то аргументы или нет.
CLI и ООП
Мы с вами изучили некоторые основы работы с CLI. Давайте теперь перенесем эти знания на объектно-ориентированный подход и научимся работать через интерфейс командной строки с объектами.
Для этого нам понадобится создать отдельную директорию под «команды». Команды – так мы будем называть наши специальные классы, которые будут выполнять какой-то код через запуск из командной строки. Создаем новую директорию: src/MyProject/Cli.
В конструкторе класса мы принимаем список параметров, сохраняем их, а затем вызываем метод checkParams(), который проверяет наличие обязательных параметров для этого скрипта. В нём просто поочередно вызывается метод для проверки в массиве нужных ключей. Если их нет – метод кинет исключение. И, наконец, есть метод execute(), который содержит бизнес-логику. В нем используется метод getParam(), который вернет параметр (при его наличии), либо вернет null (при его отсутствии).
И также создаём исключение, специально для ошибок, возникающих при работе с CLI.
Теперь давайте снова вернемся в нашу точку входа для консольных приложений cli.php. Этот файл можно назвать фронт-контроллером для консольных команд, он как index.php в случае с клиент-серверным подходом будет создавать другие объекты и запускать весь процесс.
Дополним этот код так, чтобы он создавал экземпляр нужного класса и передавал ему аргументы.
Теперь мы можем запустить наш скрипт с помощью вот такой команды:
Если мы захотим создать еще один класс, в котором мы будем вычитать из аргумента a аргумент b, то нам нужно будет продублировать довольно большой объем кода. Но ведь если присмотреться – большую часть кода из класса Summator можно вынести в отдельный класс и использовать его повторно.
Давайте создадим абстрактный класс, который будет заниматься тем, что будет сохранять переданные в него параметры и запускать метод для их проверки.
Теперь нам в классе Summator достаточно отнаследоваться от этого класса и он значительно упростится:
Запустим скрипт снова и убедимся, что все успешно отработало:
Давайте создадим по аналогии скрипт, который будет вычитать из аргумента x аргумент y.
Проверим его в деле:
А теперь давайте попробуем не указать один из аргументов – получим ошибку.
Вот таким вот нехитрым образом мы с вами научились создавать простейшие программы для запуска в консоли на PHP. А в следующем уроке мы с вами научимся запускать эти команды по расписанию.
Php работа с командной строкой
Основные отличия CLI SAPI от остальных реализаций SAPI :
В отличие от CGI SAPI заголовки не пишутся в поток вывода.
Несмотря на то, что в CGI SAPI есть способ подавить HTTP-заголовки, в CLI SAPI нет возможности их включить.
Сообщения об ошибках выдаются в текстовом режиме (без HTML-форматирования).
Таблица 43-1. Переопределяемые директивы php.ini
Благодаря значению TRUE в CLI SAPI вам всегда доступны переменные argc (количество аргументов при запуске приложения) и argv (массив текущих аргументов).
Замечание: Эти директивы не могут быть инициализированы другими значениями из конфигурационного файла php.ini или любого другого (в случае, если он указан). Это является ограничением, поскольку указанные выше значения по умолчанию применяются после обработки конфигурационных файлов. Тем не менее, эти значения могут быть изменены во время работы скрипта (хотя это не имеет особого смысла для указанных директив, например, для register_argc_argv ).
Облегчена работа с консолью, благодаря следующим определенным константам:
Таблица 43-2. Специфические CLI-константы
Также вам не надо закрывать эти потоки, PHP автоматически закрывает их после завершения скрипта.
CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта!
Пример, демонстрирующий отличие CGI SAPI :
// Простейший тестовый скрипт под названием test.php echo getcwd (), «\n» ; ?> |
В случае, если используется CGI версия, результат работы будет следующим:
Это позволяет писать более гибкие консольные скрипты на PHP.
CLI SAPI имеет три различных способа получения PHP-кода, который необходимо выполнить:
Указать PHP на исполнение конкретного файла.
Указать PHP-код для выполнения непосредственно в командной строке.
Особого внимания требует подстановка переменных окружения и использование кавычек.
Это позволяет динамически создавать PHP-код и переадресовывать его исполняемому модулю, как показано в следующем (вымышленном) примере:
Опция | Полное название | Описание | ||||
---|---|---|---|---|---|---|
-s | —syntax-highlight |
Пример 43-1. Скрипт, предназначенный для запуска из командной строки (script.php)
Php работа с командной строкой
Существенные отличия CLI SAPI от других SAPI :
Хотя в CGI SAPI имеется способ подавления HTTP-шапок, эквивалентного переключателя для их включения в CLI SAPI нет.
Примечание: Эти директивы не могут быть инициализированы другим значением из файла конфигурации php.ini или специального файла (если специфицирован). Это является некоторым ограничением, поскольку эти значения по умолчанию применяются после разбора всех файлов конфигурации. Однако их значение может быть изменено на этапе прогона программы (что не имеет смысла для всех других директив, например, для register_argc_argv).
Легче работать в среде оболочки, когда определены следующие константы:
Таблица 24-2. Специфические CLI-константы
Вам не нужно явно закрывать эти потоки, это делается РНР автоматически.
CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта!
Пример, показывающий отличие CGI SAPI :
Это ясно показывает, что PHP изменяет свою текущую директорию на директорию исполняемого скрипта.
Использование CLI SAPI даёт:
Сказать PHP выполнить определённый файл.
Передать PHP код для выполнения непосредственно из командной строки.
Особого внимания требует замена переменных оболочки и использование кавычек.
Вы не можете комбинировать эти три способа при выполнении кода.
Приняв, что файл называется test и находится в текущей директории, мы можем выполнить:
Таблица 24-3. Опции командной строки
Отображать синтаксис в цвете.
Отобразить исходный текст без комментариев и пробелов.
Разбирает и выполняет данный файл. Этот переключатель является необязательным и может быть опущен. Достаточно предоставить имя файла для выполнения.
Записывает PHP, PHP SAPI и Zend-версии в стандартный вывод, например:
Запускает PHP интерактивно.
Генерирует расширенную информацию для debugger/profiler.
Пример, выводящий ошибку разборщика:
Если вы используете оболочку/shell иначе, чем sh/bash, у вас могут появиться новые вопросы. Отправляйте bug report или mail по адресу phpdoc@lists.php.net. Можно легко столкнуться с проблемами при попытке получить переменные оболочки в коде или использовании обратных слэшей (/) для замен/escaping.
Вы предупреждены.
Пример 24-1. Скрипт, предназначенный для запуска из командной строки (script.php) |
Пример 24-2. Пакетный/Batch-файл для запуска PHP-скрипта в командной строке (script.bat) |
См. также в документации по расширению Readline о функциях, которые можно использовать для усовершенствования вашего РНР-приложения для командной строки.
Php работа с командной строкой
Основные отличия CLI SAPI от остальных реализаций SAPI :
В отличие от CGI SAPI заголовки не пишутся в поток вывода.
Несмотря на то, что в CGI SAPI есть способ подавить HTTP-заголовки, в CLI SAPI нет возможности их включить.
Сообщения об ошибках выдаются в текстовом режиме (без HTML-форматирования).
Таблица переопределяемых директив php.ini
Благодаря значению TRUE в CLI SAPI вам всегда доступны переменные argc (количество аргументов при запуске приложения) и argv (массив текущих аргументов).
Замечание: Эти директивы не могут быть инициализированы другими значениями из конфигурационного файла php.ini или любого другого (в случае, если он указан). Это является ограничением, поскольку указанные выше значения по умолчанию применяются после обработки конфигурационных файлов. Тем не менее, эти значения могут быть изменены во время работы скрипта (хотя это не имеет особого смысла для указанных директив, например, для register_argc_argv).
Облегчена работа с консолью, благодаря следующим определенным константам:
Таблица специфических CLI-констант
Также вам не надо закрывать эти потоки, PHP автоматически закрывает их после завершения скрипта.
CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта!
Пример, демонстрирующий отличие CGI SAPI :
// Простейший тестовый скрипт под названием test.php
echo getcwd (), "\n" ;
?>
В случае, если используется CGI версия, результат работы будет следующим:
Это наглядно демонстрирует тот факт, что PHP изменяет текущую директорию на директорию исполняемого скрипта.
Это позволяет писать более гибкие консольные скрипты на PHP.
CLI SAPI имеет три различных способа получения PHP-кода, который необходимо выполнить:
Указать PHP на исполнение конкретного файла.
Указать PHP-код для выполнения непосредственно в командной строке.
Это позволяет динамически создавать PHP-код и переадресовывать его исполняемому модулю, как показано в следующем (вымышленном) примере: