Запуск php скрипта из консоли
Если Вам понравился данный материал, поделитесь им с вашими друзьями в соц сетях
В данном материале мы рассмотрим такие вопросы как: настройка PHP для работы в командной строке, выполнение PHP-кода в командной строке, запуск PHP скриптов в командной строке без аргументов и с аргументами.
«На дисерт», в последнем пункте материала, будет показан процесс установки через командную строку менеджера зависимостей для PHP getcomposer.org.
Начиная с версии 4.3.0, PHP поддерживает новый вид SAPI (интерфейс разработки серверных приложений) под названием CLI, что означает интерфейс командной строки. Как видно из названия, этот вид SAPI предназначен для разработки консольных (или даже десктопных) приложений на PHP.
Начиная с PHP 4.3.0 дистрибутив для Windows влючает в себя CLI-модуль php.exe, расположенный в отдельной директории cli, полное имя — cli/php.exe. Начиная с PHP 5, CLI-модуль расположен в основной директории и называется php.exe. CGI-модуль также включен в дистрибутив под названием php-cgi.exe. Начиная с PHP 5, в дистрибутив для Windows входит новый файл php-win.exe. Он полностью эквивалентен CLI, за исключением того, что php-win абсолютно ничего не выводит, что приводит к отстутствию консоли (окно DOS не появляется на экране).
Настраиваем работу PHP из командной строки
Прежде всего Вы должны узнать расположение CLI-модуля, файла с именем «php.exe». В моем случае полный путь до данного файла выглядит так — «C:\php\php.exe».
Теперь нам нужно проверить работает ли PHP в командной строке. Для этого откроем командную строку (желательно от имени администратора) и выполним команду:
укажем полный путь до CLI-модуля, файла «php.exe» (т.е. «C:\php\php.exe»), и через пробел добавим ключ «—help».
(вызов «PHP» в консоли с ключем «—help» покажет справочную информацию).
Если после выполнения данной команды Вы получили предупреждения или сообщения об ошибках, то вероятнее всего, Вами был не верно указан путь до CLI-модуля «C:\php\php.exe».
При удачном выполнение команды должна отобразиться справочная информация. Поздравляю, Ваш PHP работает в консоли.
Вы наверное согласитесь со мной, что каждый раз указывать путь «C:\php\php.exe» довольно-таки не приятно, и конечно же, запуск PHP можно настроить без необходимости указывать полный путь до файла «C:\php\php.exe». Для этого необходимо в «Переменные среды» в переменную «PATH» добавить путь до этого файла.
Давайте ради интереса, до внесения изменений в переменную «PATH», попробуем вызвать в консоли PHP:
выполняем команду с опцией «php —help»
В ответ Вы скорее всего получите:
Теперь добавим путь до CLI-модуля «php.exe» в переменную «PATH». Найти данную переменную можно выполнив ряд действий (визуально представлено на изображениях ниже):
«Пуск» → пункт «Панель управления» → «Система» → «Изменить параметры» → вкладка «Дополнительно» → «Переменные среды» → в нижнем блоке (Системные переменные) выделяем Переменную «Path» или «PATH» → «Изменить»
В данной переменной уже имеются пути, которые разделены точкой с запятой (;). Вам необходимо добавить в конец переменной свой путь до CLI-модуля, файла «php.exe», В моем случае путь это — «C:\php\». (Будьте внимательны, при внесении изменений не удалите текущие значения).
![]()
![]()
![]()
![]()
добавим путь до CLI-модуля, файла «php.exe», в переменную «PATH»
Снова выполняем команду с ключем «php —help»
команда «php» с ключем «—help» покажет справочную информацию
Примеры работы PHP в командной строке
Откроем консоль (желательно от имени администратора) и перейдем к практике.
Рассмотрим два способа запуска PHP-кода:
- Передача PHP-кода напрямую в командной строке
- Указание конкретного файла для запуска
Первый способ. Опция «-r» (или «—run») позволяет выполнять PHP-код, указанный непосредственно в командной строке. Открывающие и завершающие PHP-теги (<?php и ?>) не нужны.
Второй способ. Опция «-f» (или «—file») позволяет исполнять указанный файл. Является не обязательной и может отсутствовать, достаточно просто указать имя файла.
Исполним индексный файл веб-сервера Apache с расширением «.html»
Исполним php скрипт
Передаем аргументы php скрипту в консоли
Как и любое другое консольное приложение, PHP может принимает аргументы, а PHP-скрипт также может получать аргументы. Рассмотрим данную возможность на примере. В корневой директории управления сайтами «C:\Apache24\htdocs» создадим файл «console.php» и внесем в него строки:
Исполним php скрипт «console.php» без передачи параметров
количество аргуметов переданных в консоли равно 1,
этим аргументом является путь до файла «C:\Apache24\htdocs\console.php»
Исполним php скрипт «console.php» с передачей параметров
количество аргуметов переданных в консоли равно 3,
первым аргументом является путь до файла «C:\Apache24\htdocs\console.php»
вторым и третим — param1, param2
Установка composer
Composer (getcomposer.org) — это инструмент для управления зависимостями в PHP. Он позволяет вам объявлять зависимые библиотеки для вашего проекта, устанавливать их и обновлять.
Перед скачиванием архива «composer.phar» убедитесь, что в конфигурационном файле «C:\php\php.ini» подключено расширение «php_openssl.dll». (Для этого раскомментируйте строку «extension=php_openssl.dll»).
для того, чтобы скачать «composer.phar» выполните следующие команды
первой командой перейдем в директорию «C:\Apache24\htdocs»
второй командой скачаем архив «composer.phar» в эту директорию
Перевод:
Все настройки верны для использования Composer
Загрузка.
Composer успешно установлен: C:\Apache24\htdocs\composer.phar
Использовать: php composer.phar
создадим файл «composer.bat»
после выполнения данной команды рядом с архивом «composer.phar» появится файл «composer.bat»
теперь находясь в директории где расположены файлы «composer.phar» и «composer.bat» можно выполнить следующие команды
первая команда выводит версию composer
вторая команда выводит справочную информацию
По итогам изучения данного материала мы осуществили настройку PHP для работы в командной строке, на практике рассмотрели примеры выполнения PHP-кода и запуска PHP скриптов в командной строке. А также нами был выполнен процесс установки composer`a.
# Getting started with PHP
PHP can be used to add content to HTML files. While HTML is processed directly by a web browser, PHP scripts are executed by a web server and the resulting HTML is sent to the browser.
The following HTML markup contains a PHP statement that will add Hello World! to the output:
When this is saved as a PHP script and executed by a web server, the following HTML will be sent to the user’s browser:
echo also has a shortcut syntax, which lets you immediately print a value. Prior to PHP 5.4.0, this short syntax only works with the short_open_tag
(opens new window) configuration setting enabled.
For example, consider the following code:
Its output is identical to the output of the following:
In real-world applications, all data output by PHP to an HTML page should be properly escaped to prevent XSS (Cross-site scripting
(opens new window) ) attacks or text corruption.
(opens new window) , which describes best practices, including the proper use of short tags ( <?= . ?> ).
# Hello, World!
The most widely used language construct to print output in PHP is echo :
Alternatively, you can also use print :
Both statements perform the same function, with minor differences:
- echo has a void return, whereas print returns an int with a value of 1
- echo can take multiple arguments (without parentheses only), whereas print only takes one argument
- echo is slightly faster
Both echo and print are language constructs, not functions. That means they do not require parentheses around their arguments. For cosmetic consistency with functions, parentheses can be included. Extensive examples of the use of echo and print are available elsewhere
C-style printf and related functions are available as well, as in the following example:
(opens new window) for a comprehensive introduction of outputting variables in PHP.
# Non-HTML output from web server
In some cases, when working with a web server, overriding the web server’s default content type may be required. There may be cases where you need to send data as plain text , JSON , or XML , for example.
(opens new window) function can send a raw HTTP header. You can add the Content-Type header to notify the browser of the content we are sending.
Consider the following code, where we set Content-Type as text/plain :
This will produce a plain text document with the following content:
(opens new window) content, use the application/json content type instead:
This will produce a document of type application/json with the following content:
Note that the header() function must be called before PHP produces any output, or the web server will have already sent headers for the response. So, consider the following code:
This will produce a warning:
Warning: Cannot modify header information — headers already sent by (output started at /dir/example.php:2) in /dir/example.php on line 3
When using header() , its output needs to be the first byte that’s sent from the server. For this reason it’s important to not have empty lines or spaces in the beginning of the file before the PHP opening tag <?php . For the same reason, it is considered best practice (see PSR-2
(opens new window) ) to omit the PHP closing tag ?> from files that contain only PHP and from blocks of PHP code at the very end of a file.
(opens new window) to learn how to ‘catch’ your content into a variable to output later, for example, after outputting headers.
# PHP built-in server
PHP 5.4+ comes with a built-in development server. It can be used to run applications without having to install a production HTTP server such as nginx or Apache. The built-in server is only designed to be used for development and testing purposes.
It can be started by using the -S flag:
# Example usage
- Create an index.php file containing:
# Configuration
To override the default document root (i.e. the current directory), use the -t flag:
E.g. if you have a public/ directory in your project you can serve your project from that directory using php -S localhost:8080 -t public/ .
Every time a request is made from the development server, a log entry like the one below is written to the command line.
# PHP CLI
PHP can also be run from command line directly using the CLI (Command Line Interface).
CLI is basically the same as PHP from web servers, except some differences in terms of standard input and output.
# Triggering
The PHP CLI allows four ways to run PHP code:
- Standard input. Run the php command without any arguments, but pipe PHP code into it:
- Filename as argument. Run the php command with the name of a PHP source file as the first argument:
- Code as argument. Use the -r option in the php command, followed by the code to run. The <?php open tags are not required, as everything in the argument is considered as PHP code:
- Interactive shell. Use the -a option in the php command to launch an interactive shell. Then, type (or paste) PHP code and hit return :
# Input
# Instruction Separation
Just like most other C-style languages, each statement is terminated with a semicolon. Also, a closing tag is used to terminate the last line of code of the PHP block.
If the last line of PHP code ends with a semicolon, the closing tag is optional if there is no code following that final line of code. For example, we can leave out the closing tag after echo "No error"; in the following example:
However, if there is any other code following your PHP code block, the closing tag is no longer optional:
We can also leave out the semicolon of the last statement in a PHP code block if that code block has a closing tag:
It is generally recommended to always use a semicolon and use a closing tag for every PHP code block except the last PHP code block, if no more code follows that PHP code block.
So, your code should basically look like this:
# PHP Tags
There are three kinds of tags to denote PHP blocks in a file. The PHP parser is looking for the opening and (if present) closing tags to delimit the code to interpret.
# Standard Tags
These tags are the standard method to embed PHP code in a file.
# Echo Tags
These tags are available in all PHP versions, and since PHP 5.4 are always enabled. In previous versions, echo tags could only be enabled in conjunction with short tags.
# Short Tags
You can disable or enable these tags with the option short_open_tag .
-
are disallowed in all major PHP coding standards
# ASP Tags
By enabling the asp_tags option, ASP-style tags can be used.
These are an historic quirk and should never be used. They were removed in PHP 7.0.
# Remarks

(opens new window) (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source programming language. It is especially suited for web development. The unique thing about PHP is that it serves both beginners as well as experienced developers. It has a low barrier to entry so it is easy to get started with, and at the same time, it provides advanced features offered in other programming languages.
Open-Source
It’s an open-source project. Feel free to get involved
Language Specification
Supported Versions
Currently, there are three supported versions
Each release branch of PHP is fully supported for two years from its initial stable release. After this two year period of active support, each branch is then supported for an additional year for critical security issues only. Releases during this period are made on an as-needed basis: there may be multiple point releases, or none, depending on the number of reports.
Unsupported Versions
Once the three years of support are completed, the branch reaches its end of life and is no longer supported.
Issue Tracker
Bugs and other issues are tracked at https://bugs.php.net/
Mailing Lists
Discussions about PHP development and usage are held on the PHP mailing lists
Command Line Interface в PHP
До этого момента мы с Вами знали, что PHP работает на сервере. Клиент обращается к серверу по протоколу HTTP с каким-либо запросом, запрос на сервере обрабатывается и формируется ответ. После этого клиенту снова по протоколу HTTP в ответе отдаётся сформированный ответ. Однако, если взять какой-нибудь более-менее продвинутый сайт, то мы увидим, что есть задачи, которые не решаются стандартным клиент-серверным путем. Например: поздравлять пользователей с днём рождения и дарить им скидку на какой-нибудь продукт. Для того, чтобы это сделать, нам придется обновлять раз в день php-скрипт в браузере, чтобы он выбирал пользователей, у которых сегодня ДР, затем создавал для них скидки, и отправлял им сообщения по почте. Согласитесь, неудобно это делать вручную и в браузере. Для таких случаев в PHP предусмотрен Command Line Interface (CLI) – интерфейс командной строки.
CLI позволяет запускать программы на PHP не через привычную нам клиент-серверную архитектуру, а как простые программы в командной строке. Давайте создадим простейший скрипт, чтобы показать, как это работает. Создаём новую папку bin в корне проекта, а в ней файл – cli.php.

Пишем простейший код:
А теперь запускаем консоль из OpenServer: 
Переходим в папку с нашим проектом, выполнив:
И пишем следующую команду:
В ответ получаем: 
Написали простейшее консольное приложение! Уже неплохо. Но что если мы захотим сложить 2 числа, которые нужно передать скрипту? Как Вы понимаете, сделать это с помощью GET- или POST- запросов уже не получится. Так как же быть?
Аргументы консольного приложения
На помощь нам приходят аргументы, которые мы можем передать в скрипт, указав их после имени скрипта в командной строке. Вот так: 
А для того, чтобы получить к ним доступ из php-скрипта используется магическая переменная $argv. Она представляет собой массив, в котором нулевой элемент – это путь до скрипта, а все последующие – это его аргументы в консоли.
Давайте теперь запустим наш скрипт с параметрами: 
Как видим, наши аргументы попали в этот массив. Давайте напишем простейший скрипт, который будет складывать все переданные ему аргументы.
Запустим его, и убедимся, что все работает: 
И он действительно работает: 3 + 4 + 5 = 12.
А что если мы хотим передавать аргументы с именами? Вроде такого: 
И затем в коде получать их в коде по их именам? Для этого нам следует написать простейший парсер, который будет находить вот такие именованные параметры и их значения. Пишем.
И проверяем его работу: 
Отлично, теперь мы можем обращаться к элементам массива params, чтобы выяснить, были ли нам переданы какие-то аргументы или нет.
CLI и ООП
Мы с вами изучили некоторые основы работы с CLI. Давайте теперь перенесем эти знания на объектно-ориентированный подход и научимся работать через интерфейс командной строки с объектами.
Для этого нам понадобится создать отдельную директорию под «команды». Команды – так мы будем называть наши специальные классы, которые будут выполнять какой-то код через запуск из командной строки. Создаем новую директорию: src/MyProject/Cli. 
И теперь создадим наш первый класс, который будет заниматься тем, что считает сумму переданных в него аргументов: -a и -b.
В конструкторе класса мы принимаем список параметров, сохраняем их, а затем вызываем метод checkParams(), который проверяет наличие обязательных параметров для этого скрипта. В нём просто поочередно вызывается метод для проверки в массиве нужных ключей. Если их нет – метод кинет исключение. И, наконец, есть метод execute(), который содержит бизнес-логику. В нем используется метод getParam(), который вернет параметр (при его наличии), либо вернет null (при его отсутствии).
И также создаём исключение, специально для ошибок, возникающих при работе с CLI.
Теперь давайте снова вернемся в нашу точку входа для консольных приложений cli.php. Этот файл можно назвать фронт-контроллером для консольных команд, он как index.php в случае с клиент-серверным подходом будет создавать другие объекты и запускать весь процесс.
Дополним этот код так, чтобы он создавал экземпляр нужного класса и передавал ему аргументы.
Теперь мы можем запустить наш скрипт с помощью вот такой команды: 
Если мы захотим создать еще один класс, в котором мы будем вычитать из аргумента a аргумент b, то нам нужно будет продублировать довольно большой объем кода. Но ведь если присмотреться – большую часть кода из класса Summator можно вынести в отдельный класс и использовать его повторно.
Давайте создадим абстрактный класс, который будет заниматься тем, что будет сохранять переданные в него параметры и запускать метод для их проверки.
Теперь нам в классе Summator достаточно отнаследоваться от этого класса и он значительно упростится:
Запустим скрипт снова и убедимся, что все успешно отработало: 
Давайте создадим по аналогии скрипт, который будет вычитать из аргумента x аргумент y.
Проверим его в деле: 
А теперь давайте попробуем не указать один из аргументов – получим ошибку. 
Вот таким вот нехитрым образом мы с вами научились создавать простейшие программы для запуска в консоли на PHP. А в следующем уроке мы с вами научимся запускать эти команды по расписанию.
Запуск PHP скриптов из консоли Linux
Разработчик BackEndЯзык PHP 
Давайте сначала решим зачем нам может понадобиться запускать скрипты PHP через интерфейс командной строки Linux. Первое и самое очевидное решение, мы пишем простой скрипт который должен делать нечто в нашей системе. То есть мы используем PHP как расширенный Bush-скриптинг. Хотим как-то особенно сортировать файлы, делать запись в базу данных, отправлять сообщения или все одновременно. PHP позволяет реализовать это с легкостью. Повесим скрипт в Crone и вот полноценное системное приложение, несущее полезную нагрузку.
Минусов у такого подхода вагон. Из очевидных это ограничение по времени выполнения и ресурсам сервера. Но рано или поздно любой разработчик на PHP сталкивается с такой необходимостью. И знать как работает PHP в том числе и в консоли хоть и не строго обязательно, но лишним точно не будет.
Итак приступая к работе нужно понимать, что вы можете запустить любой скрипт PHP простой командой: php ../puth/index.php . Это не совсем правильная команда, она чаще всего сработает, но вот что нужно понимать: вы запускаете скрипт с версией PHP по умолчанию, ваш интерпретатор может не поддерживать такой запуск. Попробуйте так сделать и посмотрите что будет выведено в консоль. Мой PHP-FPM 7.4 выдал исходный код скрипта мне прямо в консоль. А вот на другом сервере я получил ошибку. Хотя версия установлена идентичная. Все дело в том, что на втором сервере установлено сразу две версии интерпретатора языка и версия по умолчанию просто не запущена. Я не стал разбираться как такое может быть, просто указал конкретный интерпретатор /usr/bin/php7.4 /var/site.ru/script.php .
Есть еще одна особенность. Если вызвать скрипт /usr/bin/php /var/site.ru/script.php , находясь в другой директории, можно получить ошибку доступа. У меня создается файл log.txt и строчка вызова fopen(«log.txt», «w»); выдавала ошибку, пока я не «вошел» в консоли в директорию со скриптом запуска. Но когда добавил версию интерпретатора, вызов начал работать как надо.
Вы можете проверить какие версии бинарниуков есть в вашей системе, просто взглянув на содержимое директории /usr/bin/. Если в папке присутствует несколько версий, тогда просто укажите при запуске ту, которая работает по умолчанию. Проверить версию по умолчанию: php -v .
Я запускаю скрипт и получаю в консоль весь исходный код. У меня подразумевался вывод echo и я хотел получать результаты работы скрипта, но судя по логу, который я предусмотрительно решил записывать в файл, скрипт отработал как положено. То есть, осталось решить вопрос с выводом результата.
Тут как всегда несколько путей. Первый, самый простой как пуля в лоб. Будем писать весь вывод в космос на «пустое устройство», добавив в конец строки: > /dev/null . Но в пустоту будет отправлен не весь вывод, а только стандартный. Мы все же получим поток ошибок, если в него что-то поступит. Вот только ошибки PHP7 это часть стандартного потока, а ждать системных ошибок от работы интерпретатора это как носить зонт в солнечный день.
Еще одна проблема подхода «в лоб» в том, что мы запускаем «однофайловый» скрипт. Если в нем будет require то получим ошибку. Интерпретатор сообщит, что не шарит в пространстве имен и не может подключить файл. Можно захардкодить путь к директории от корня сервера, можно добавить константу: $_SERVER[«DOCUMENT_ROOT»] = realpath(dirname(__FILE__).’/../..’); , это может сработать, да. Но может и не сработать. Если вы еще не поняли, многое зависит от конфигурации php, версии и установки.
Если все работает и так, можно немного расширить наш вывод /usr/bin/php7.4 /var/site.ru/script.php > /dev/null & echo $! , в таком случае будем получать ошибки и предупреждения, а так же вывод echo из самого PHP скрипта.
Когда вы получаете ошибку связанную с конфигурацией PHP, например, скрипт требует параметры которые вы по каким-то причинам не желаете включать в php.ini можно вызвать скрипт с этими параметрами. Дам часто используемый пример:
/usr/bin/php7.4 -d display_errors -d short_open_tag /var/site.ru/script.php
Здесь мы подключили модуль вывода ошибок display_errors и short_open_tag, вместо того, чтобы включать их в php.ini. Это удобно, если параметры не требуются для работы остальных скриптов или не рекомендованы с точки зрения безопасности, а вам они полезны.
Как видите, мы указываем директивы PHP при помощи опции -d (—define). Опций существует большое количество и узнать о них можно в официальной документации. Можно так же получить всю информацию по опциям, запросив их через /usr/bin/php7.4 —help .
Чтобы полноценно работать с консолью в PHP существует пакет php-cli . Установив его sudo apt-get install php-cli7.4 , получаем куда больше возможностей. Первая возможность, о которой следует помнить это то, что теперь для php который мы будем использовать в консоли есть свой php.ini.
Настроить его можно sudo vim /etc/php/7.4/cli/php.ini . Вы можете внести все необходимые настройки. Например, можно увеличить лимиты для скриптов запускаемых из консоли или установить какие-то небезопасные параметры, которые будут использоваться только через php-cli.
Таким образом, мы можем получить некий аналог Bush только с ООП.
А что на счет консольных приложений? Имеются в виду полноценные консольные приложения на PHP. Оказывается, мы можем пойти еще дальше и написать полноценное консольное приложение используя CLI SAPI. Собственно, его мы и использовали, указывая директивы.
