Работа с PHP из командной строкиРабота с PHP из командной строкиВведение
Основная цель этого &cli.sapi; —
разработка консольных приложений на PHP.
Есть довольно много различий между
&cli.sapi; и другими видами SAPI, которые
будут рассмотрены в этой главе.
Стоит отметить, что &cli.sapi; и CGI —
различные SAPI-интерфейсы, хотя в их поведении много общего.
&cli.sapi; включается по умолчанию с помощью опции
, но может быть выключен
опцией при запуске
./configure.
Имя, расположение и существование бинарных модулей
&cli;/CGI зависит от того, как именно
установлен PHP в вашей системе. По умолчанию при выполнении
make создаётся как CGI-,
так и &cli;-модуль, размещённые в директориях
sapi/cgi/php-cgi
и sapi/cli/php соответственно,
внутри директории с исходниками PHP.
Следует заметить, что оба файла имеют одинаковое название:
php.
Что произойдёт при выполнении make install,
зависит от того, какие опции вы указали на стадии
конфигурирования. Если выбран модуль SAPI
во время выполнения, например, apxs, или используется опция
опция ,
модуль &cli; будет скопирован в {PREFIX}/bin/php при
выполнении make install, в противном случае
будет скопирован CGI-модуль. Например, если
задана опция ,
то при выполнении make install
&cli;-версия будет скопирована в {PREFIX}/bin/php.
Если вы хотите переопределить установку CGI-модуль,
используйте make install-cli после выполнения
make install. В качестве альтернативы
вы могли бы указать опцию
в строке конфигурации.
Поскольку обе опции,
и , включены
по умолчанию, просто наличие
в команде
конфигурации необязательно означает, что &cli; будет скопирован
в {PREFIX}/bin/php при выполнении
make install.
Бинарный файл &cli; входит в дистрибутив
для Windows в основной папке в качестве файлаphp.exe.
CGI-версия находится в файле php-cgi.exe.
Кроме того, в дистрибутив входит файл php-win.exe,
если PHP был сконфигурирован с помощью .
Он полностью эквивалентен &cli;-версии, за исключением того,
что абсолютно ничего не выводит, и, таким образом, не предоставляет консоль
(окно терминала не появляется на экране).
Какой из вариантов SAPI установлен?
Выполните из командной строки php -v
для получения информации о том, является ли php
CGI или &cli;. Также вы можете использовать
функцию php_sapi_name или константу
PHP_SAPI.
Соответствующую страницу руководства (man)
Unix можно просмотреть с помощью команды man php
в консоли.
Основные отличия от остальных реализаций SAPI
Основные отличия &cli; SAPI от остальных реализаций
SAPI:
В отличие от CGI SAPI,
заголовки не пишутся в поток вывода.
Несмотря на то, что в CGI SAPI
есть способ подавления HTTP-заголовков, в &cli.sapi; нет
возможности их включить.
&cli; по умолчанию запускается в тихом режиме, тем не менее,
ключи и
сохранены для обратной совместимости, что позволяет
использовать старые CGI-скрипты.
Текущая директория не изменяется на рабочую директорию скрипта.
(Ключи и
сохранены для обратной совместимости)
Сообщения об ошибках выдаются в текстовом режиме
(без HTML-форматирования).
Некоторые настройки &php.ini; переопределяются &cli.sapi;,
поскольку они не имеют смысла при работе в командной строке:
Переопределяемые директивы &php.ini;ДирективаЗначение по умолчанию в &cli; SAPIКомментарийhtml_errors&false;
По умолчанию &false;, т.к. бывает достаточно сложно читать в консоли
сообщения об ошибке, когда они наполнены бессмысленными HTML-тегами.
implicit_flush&true;
Обычно в консоли желательно отображать вывод, например,
из print,
echo и других,
сразу же минуя буфер. Тем не менее, по-прежнему можно использовать
буферизацию вывода для
отложенного вывода или манипуляций с ним.
max_execution_time0 (без ограничений)
PHP, выполняемый в консоли, как правило, используется для более широкого диапазона
задач, чем обычные веб-скрипты. И так как они могут выполняться очень долго,
то максимальное время выполнения неограниченно.
register_argc_argv&true;
Установка этой опции в значение &true; означает, что скрипты
запускаемые через &cli; SAPI всегда
имеют доступ к argc (количество аргументов, переданных приложению)
и argv (массив текущих аргументов).
При использовании &cli; SAPI
переменные $argc и $argv
автоматически заполняются соответствующими значениями. Эти
значения можно также найти в массиве $_SERVER,
например: $_SERVER['argv'].
output_buffering&false;
Несмотря на то, что эта опция &php.ini; жёстко установлена в &false;,
функции буферизации вывода всё ещё
доступны.
max_input_time&false;
PHP &cli; не поддерживает GET, POST или загрузку файлов.
Эти директивы не могут быть инициализированы другими значениями
из конфигурационного файла &php.ini; или любого другого (в случае, если он указан).
Это ограничение связано с тем, что значения применяются
после обработки конфигурационных файлов. Тем не менее, эти значения
могут быть изменены во время работы скрипта (хотя это не имеет особого смысла
для всех них, например register_argc_argv).
Рекомендуется установить опцию
ignore_user_abort для
скриптов, используемых из командной строки. За подробностями
обращайтесь к функции ignore_user_abort.
Для облегчения работы в окружении оболочки было определено
некоторое количество констант для
потоков ввода-вывода.
&cli.sapi; не
изменяет текущую директорию на директорию исполняемого скрипта.
Пример, демонстрирующий разницу с CGI SAPI:
]]>
В случае, если используется CGI-версия, результат работы будет следующим:
Это наглядно демонстрирует, что PHP изменяет
текущую директорию на директорию исполняемого скрипта.
Использование &cli.sapi; даёт другой результат:
Это обеспечивает большую гибкость при написании консольных скриптов на PHP.
CGI SAPI позволяет
получить аналогичное &cli.sapi; поведение в случае
использования ключа
при запуске из командной строки.
Список опций командной строкиОпции
Список опций командной строки, предоставляемых PHP,
могут быть получены в любой момент, запустив PHP с ключом :
[--] [args...]
php [options] -r [--] [args...]
php [options] [-B ] -R [-E ] [--] [args...]
php [options] [-B ] -F [-E ] [--] [args...]
php [options] -- [args...]
php [options] -a
-a Run interactively
-c | Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f Parse and execute .
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-r Run PHP without using script tags ..?>
-B Run PHP before processing input lines
-R Run PHP for every input line
-F Parse and execute for every input line
-E Run PHP after processing all input lines
-H Hide any passed arguments from external tools.
-S : Run with built-in web server.
-t Specify document root for built-in web server.
-s Output HTML syntax highlighted source.
-v Version number
-w Output source with stripped comments and whitespace.
-z Load Zend extension .
args... Arguments passed to script. Use -- args when first argument
starts with - or script is read from stdin
--ini Show configuration file names
--rf Show information about function .
--rc Show information about class .
--re Show information about extension .
--rz Show information about Zend extension .
--ri Show configuration for extension .
]]>
Опции, доступные из командной строкиОпцияПолное названиеОписание-a--interactive
Запустить PHP в интерактивном режиме. Для получения дополнительной информации смотрите
раздел Интерактивная консоль.
-b--bindpath
Путь связывания библиотек (Bind Path) для внешнего режима FASTCGI Server (только для CGI).
-C--no-chdir
Не менять текущую директорию на директорию скрипта (только для CGI).
-q--no-header
Тихий режим. Подавляет вывод заголовков HTTP
(только для CGI).
-T--timing
Измерить время выполнения скрипта, повторенного count
раз (только для CGI).
-c--php-ini
Указывает, либо директорию, в которой нужно искать
конфигурационный файл &php.ini;, либо пользовательский
INI-файл (название которого может
отличаться от стандартного &php.ini;), например:
Если эта опция не указана, поиск &php.ini; будет осуществлён
в местах по умолчанию.
-n--no-php-ini
Полностью игнорировать &php.ini;.
-d--define
Устанавливает пользовательское значение для каждой из
конфигурационных опций, доступных в &php.ini;. Синтаксис выглядит следующим образом:
Пример команды с параметром -d для установки INI-настройки-e--profile-info
Включить режим расширенной информации, используемый
отладчиком/профайлером.
-f--file
Парсит и исполняет файл, указанный в опции .
Этот параметр необязателен и может быть опущен — достаточно
просто указать имя запускаемого файла.
-h и -?--help и --usage
Выводит список опций командной строки с однострочным описанием того, что они делают.
-i--info
Вызывает phpinfo и выводить её результат.
В случае, если PHP работает некорректно, рекомендуется
выполнить php -i и
посмотреть, выводятся ли сообщения об ошибках до или
вместо информационных таблиц. Учитывайте, что в случае использования
CGI-модуля весь вывод будет в формате
HTML и, как следствие, очень большим.
-l--syntax-check
Предоставляет удобный способ для проверки заданного
PHP-кода на наличие синтаксических ошибок.
В случае успешной проверки будет напечатана следующая фраза:
"No syntax errors detected in <filename>",
а код возврата будет равен 0.
При неудачной проверке будет выведено "Errors parsing <filename>"
вместе с внутренними сообщениями парсера, а код возврата будет равен -1.
Данная опция не будет обнаруживать
фатальные ошибки (например, вызов неопределённых функций).
Используйте опцию , если вы
хотите проверить код на наличие фатальных ошибок.
Эта опция не работает с опцией .
-m--modulesВывод встроенных (и загруженных) модулей PHP и Zend-r--run
Позволяет выполнять PHP-код, указанный
непосредственно в командной строке. Открывающие и закрывающие
PHP-теги (<?php и ?>)
не нужны и будут
приводит к синтаксической ошибке, если они присутствуют.
При использовании этого ключа следует быть очень осторожным и избегать
недоразумений, связанных с автоматической подстановкой переменных окружения.
Ошибка синтаксиса при использовании двойных кавычек
Проблема здесь заключается в том, что sh/bash выполняет автоматическую
подстановку переменных в случае, если используются двойные кавычки
("). Поскольку переменная $foo
вряд ли определена, она заменяется пустой строкой, что приводит к тому,
что передаваемый PHP-код для выполнения выглядит следующим образом:
Правильным решением в данном случае будет использование
одинарных кавычек ', поскольку автоматическая
подстановка переменных, заключённых в одинарные кавычки, в sh/bash не происходит.
Использование одинарных кавычек для предотвращения
подстановки переменных в консоли
int(1)
["E_WARNING"]=>
int(2)
["E_PARSE"]=>
int(4)
["E_NOTICE"]=>
int(8)
["E_CORE_ERROR"]=>
[...]
]]>
При использовании оболочки, отличной от sh/bash, могут возникнуть
другие проблемы. В таком случае необходимо создать отчёт о возникшей ошибке на сайте
&url.php.bugs;.
Можно столкнуться с проблемами при попытке получить доступ
к переменным оболочки или при работе с экранирующими обратными слешами.
Теперь вы предупреждены!
Ключ доступен в &cli.sapi;, но недоступен
в CGI SAPI.
Эта опция предназначена только для самого простого кода.
Поэтому некоторые конфигурационные директивы (например,
auto_prepend_file
и auto_append_file)
в этом режиме будут проигнорированы.
-B--process-begin
Выполняемый код PHP перед обработкой потока ввода (stdin).
-R--process-code
PHP-код, выполняемый для каждой строки ввода.
В этом режиме есть две специальные переменные:
$argn и $argi.
$argn содержит строку, которую PHP
обрабатывает в данный момент, а $argi
содержит номер этой строки.
-F--process-file
PHP-файл, выполняемый для каждой строки ввода.
-E--process-end
PHP-код, выполняемый после обработки ввода.
Использование опций , и
для подсчёта количества строк в
проекте.
-S--server
Запускает встроенный веб-сервер.
-t--docroot
Указывает корень документа для
встроенного веб-сервера.
-s--syntax-highlight и --syntax-highlighting
Показать исходный код с подсветкой синтаксиса.
Эта опция использует внутренний механизм для разбора файла
и записи в стандартный поток вывода подсвеченной версии
этого файла. Учтите, что все что она делает, это генерирует
блок <code> [...] </code>
HTML-тегов, без HTML-заголовков.
Эта опция несовместима с опцией .
-v--versionИспользование для получения
типа SAPI и версии PHP и Zend-w--strip
Показать исходный код без комментариев и пробелов.
Эта опция несовместима с опцией .
-z--zend-extension
Загружает модуль Zend. Если передано только имя файла,
PHP попытается загрузить этот модуль из пути библиотек
по умолчанию (обычно указывается в /etc/ld.so.conf в
системах Linux). Передача файла с абсолютным путём не будет использовать
системный путь поиска библиотеки. Относительное имя файла, содержащее
директорию, укажет PHP подгрузить модуль относительно
текущей директории.
--ini
Показывает имена конфигурационных файлов и отсканированные директории.
Пример --ini--rf--rfunction
Показывает информацию об указанной функции или методе
класса (например, количество и названия параметров).
Эта опция доступна только в том случае, если PHP был скомпилирован
с поддержкой Reflection.
Базовое использование --rf
public function var_dump ] {
- Parameters [2] {
Parameter #0 [ $var ]
Parameter #1 [ $... ]
}
}
]]>
--rc--rclass
Показывает информацию об указанном классе
(список констант, свойств и методов).
Эта опция доступна только в том случае, если PHP был скомпилирован
с поддержкой Reflection.
Пример --rc
class Directory ] {
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [0] {
}
- Methods [3] {
Method [ public method close ] {
}
Method [ public method rewind ] {
}
Method [ public method read ] {
}
}
}
]]>
--re--rextension
Показывает информацию об указанном модуле
(список опций &php.ini;, определённых функций, констант
и классов).
Эта опция доступна только в том случае, если PHP был скомпилирован
с поддержкой Reflection.
Пример --re
extension #19 json version 1.2.1 ] {
- Functions {
Function [ function json_encode ] {
}
Function [ function json_decode ] {
}
}
}
]]>
--rz--rzendextension
Показывает информацию о конфигурации указанного Zend-модуля
(та же информация, которая возвращается phpinfo).
--ri--rextinfo
Показывает информацию о конфигурации указанного модуля
(та же информация, которая возвращается phpinfo).
Конфигурацию ядра можно узнать, указав в качестве имени
модуля значение "main".
Пример --ri
enabled
"Olson" Timezone Database Version => 2009.20
Timezone Database => internal
Default timezone => Europe/Oslo
Directive => Local Value => Master Value
date.timezone => Europe/Oslo => Europe/Oslo
date.default_latitude => 59.930972 => 59.930972
date.default_longitude => 10.776699 => 10.776699
date.sunset_zenith => 90.583333 => 90.583333
date.sunrise_zenith => 90.583333 => 90.583333
]]>
Опции -rBRFEH, --ini и
--r[fcezi] доступны только в &cli;.
Выполнение PHP-файловИспользование
В &cli.sapi; есть три различных способа запуска PHP-кода:
Указание конкретного файла для запуска.
Оба способа (с указанием опции или без) запустят
файл my_script.php. Нет ограничений, какой
файл запускать; в частности, файлы не обязаны иметь
расширение .php.
Передать PHP-код напрямую в командной строке.
Необходимо быть особо осторожным при использовании этого способа,
т.к. может произойти подстановка переменных оболочки при использовании
двойных кавычек.
Внимательно прочтите пример: в нем нет открывающих и закрывающих тегов!
Опция просто в них не нуждается, и их использование
приведёт к ошибке разбора.
Передать запускаемый PHP-код через стандартный поток ввода
(stdin).
Это даёт мощную возможность создавать PHP-код и
передавать его запускаемому файлу, как показано в этом
(вымышленном) примере:
final_output.txt
]]>
Вы не можете комбинировать любой из этих трёх способов запуска кода.
Как и любое другое консольное приложение бинарный файл PHP
принимает аргументы, но PHP-скрипт также получает
аргументы. PHP не ограничивает количество аргументов,
передаваемых в скрипт (оболочка консоли устанавливает
некоторый порог количества символов, которые могут передать;
обычно этого лимита хватает). Переданные аргументы доступны
в глобальном массиве $argv. Первый индекс
(ноль) всегда содержит имя вызываемог из командной
строкио скрипта. Учтите, что если код вызывается из командной
строки на лету с опцией , значением
элемента $argv[0] будет «Стандартный поток» (Standard input code);
до PHP 7.2.0 это был дефис ("-"). То же самое верно и для кода,
переданного через конвейер из STDIN.
Вторая зарегистрированная глобальная переменная —
$argc, которая содержит количество элементов
в массиве $argv
(а не количество аргументов,
которые передали скрипту).
Если передаваемые аргументы не начинаются с символа
-, то особых проблем быть не должно.
Передаваемый в скрипт аргумент, который начинается с -
создаст проблемы, т.к. PHP решит, что он сам должен его
обработать. Для предотвращения подобного поведения
используйте разделитель списка аргументов --.
После того, как этот разделитель будет проанализирован PHP, все последующие
аргументы будут переданы в скрипт нетронутыми.
[args...]
[...]
# Эта команда передаст аргумент '-h' в скрипт, предотвратив показ справки PHP
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
]]>
Однако, в Unix-системах есть ещё один способ использования
PHP для консольных скриптов. Можно написать скрипт,
первая строка которого будет начинаться с
#!/usr/bin/php (или же другой
корректный путь к бинарному файлу PHP &cli;).
После этой строки можно поместить обычный PHP-код, заключённый
в открывающие и закрывающие теги PHP. Как только будут установлены
корректные атрибуты запуска на файл (например,
chmod +x test), скрипт может быть
запущен как обычный консольный или perl-скрипт:
Запуск PHP-скрипта как консольного
]]>
Предполагая, что этот файл назван test
и находится в текущей директории, можно сделать следующее:
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
]]>
Как можно увидеть, в этом случае не нужно заботиться о
передаче параметров, которые начинаются с -.
Исполняемый PHP-файл может использоваться для запуска PHP-скриптов
независимо от веб-сервера. В случае работы в Unix-подобной системе,
необходимо добавить в первую строку файла #! (называемый также "shebang")
чтобы указать, какая из программ должна запускать скрипт.
На Windows-платформах можно назначить обработчик php.exe для файлов
с расширениями .php или создать пакетный
(.bat) файл для запуска скриптов посредством PHP.
Строка, добавляемая в начале скрипта для Unix-систем,
не влияет на их работу в ОС Windows, таким образом можно
создавать кроссплатформенные скрипты. Ниже приведён простой
пример скрипта, выполняемого из командной строки:
Скрипт, предназначенный для запуска из командной строки (script.php)
Это консольный PHP-скрипт, принимающий один аргумент.
Использование:
В приведённом выше скрипте в первой строке содержится shebang,
указывающий что этот файл должен запускаться PHP. Работа ведётся с &cli;-версией,
поэтому не будет выведено ни одного HTTP-заголовка.
Скрипт сначала проверяет наличие обязательного одного аргумента (в дополнение к
имени скрипта, который также подсчитывается). Если их нет, или если переданный
аргумент был , ,
или , выводится
справочное сообщение с использованием $argv[0], которое содержит
имя выполняемого скрипта. В противном случае просто выводится полученный аргумент.
Для запуска приведённого примера в Unix-системе, нужно сделать
его исполняемым и просто выполнить в консоли
script.php echothis или
script.php -h. В Windows-системе можно
создать пакетный файл:
Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)
Предполагая, что вышеприведённый скрипт называется
script.php, а полный путь к &cli;
php.exe находится в
C:\php\php.exe, этот пакетный файл
запустит его с переданными параметрами:
script.bat echothis или
script.bat -h.
Также можно ознакомиться с модулем
Readline для получения
дополнительных функций, которые можно использовать для улучшения
консольного PHP-скрипта.
В Windows запуск PHP можно настроить без
необходимости указывать C:\php\php.exe или
расширение .php.
Подробнее эта тема описана в разделе
Запуск PHP из
командной строки в Microsoft Windows.
В Windows рекомендуется запускать PHP под актуальной учётной записью пользователя.
При работе в сетевой службе некоторые операции не будут выполнены, поскольку
"сопоставление имён учётных записей и идентификаторов безопасности не выполнено".
Потоки ввода-выводаПотоки ввода-вывода
Модуль &cli.sapi; определяет набор констант для потоков
ввода-вывода, чтобы упростить работу с командной строкой.
Константы, специфичные для модуля CLIКонстантаОписаниеSTDINУже открытый поток ввода (stdin).
Это предотвращает необходимость его открывать следующим способом:
]]>
Если вы хотите прочесть одну строку из stdin,
можно использовать следующий код:
]]>
STDOUT
Уже открытый поток вывода (stdout).
Это предотвращает необходимость его открывать следующим способом:
]]>
STDERR
Уже открытый поток ошибок (stderr).
Это предотвращает необходимость его открывать следующим способом:
]]>
Учитывая вышесказанное, нет необходимости самому открывать поток,
например, stderr, а можно просто
использовать уже определённую константу ресурса потока:
Вам не нужно явно закрывать эти потоки, они будут закрыты PHP
автоматически при окончании вашего скрипта.
Эти константы недоступны, если считывается PHP-скрипт
из stdin.
Интерактивная консоль
Модуль &cli.sapi; предоставляет
интерактивную консоль, используя опцию
, если PHP был скомпилирован с опцией
.
Начиная с PHP PHP 7.1.0, интерактивная консоль также доступна на Windows, если
модуль readline включён.
Используя интерактивную консоль, можно ввести и выполнить
непосредственно PHP-код.
Запуск кода в интерактивной консоли
echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >
]]>
Интерактивная консоль также автодополняет (с помощью клавиши Tab)
имена функций, констант, классов, переменных, вызовы
статических методов и константы классов.
Автодополнение по Tab
Двойное нажатие клавиши Tab при наличии нескольких вариантов
дополнения покажет список этих вариантов:
strp[TAB][TAB]
strpbrk strpos strptime
php > strp
]]>
Когда есть только одно дополнение, одиночное нажатие
Tab дополнит оставшийся текст на той же самой строке:
strpt[TAB]ime(
]]>
Дополнение также работает для имён, которые были объявлены
в течение данной интерактивной сессии:
$fooThisIsAReallyLongVariableName = 42;
php > $foo[TAB]ThisIsAReallyLongVariableName
]]>
Интерактивная консоль хранит историю команд, для доступа к которой
можно использовать стрелки вверх и вниз.
История хранится в файле ~/.php_history.
Модуль &cli.sapi; предоставляет
две новые настройки в &php.ini;: cli.pager и
cli.prompt. Настройка cli.pager
позволяет использовать внешнюю программу (такую как less)
для постраничного просмотра данных вместо их прямого вывода на экран.
Настройка cli.prompt позволяет задавать
приглашение php > на ввод команды.
Также можно устанавливать настройки &php.ini; в интерактивной
консоли, используя специальное сокращение.
Установка настройки &php.ini; в интерактивной консоли
Настройка cli.prompt:
#cli.prompt=hello world :>
hello world :>
]]>
Используя обратные апострофы можно задать PHP-код, который
выполнится в приглашении на ввод команды:
#cli.prompt=`echo date('H:i:s');` php >
15:49:35 php > echo 'hi';
hi
15:49:43 php > sleep(2);
15:49:45 php >
]]>
Установка less для постраничного вывода данных:
#cli.pager=less
php > phpinfo();
(output displayed in less)
php >
]]>
Настройка cli.prompt поддерживает
несколько управляющих последовательностей:
Управляющие последовательности cli.promptУправляющая последовательностьОписание\e
Используется для добавления цветов в приглашение на ввод команды.
Пример: \e[032m\v \e[031m\b \e[34m\> \e[0m\vВерсия PHP.\b
Отображает в какой части PHP мы находимся. Для примера /*
показывает, что мы находимся в многострочном комментарии. Внешняя область
видимости обозначается как php.
\>
Указывает символ приглашения. По умолчанию это символ >,
но можно изменить, когда оболочка находится внутри незакрытого блока или строки.
Возможные символы: ' " { ( >
Файлы, подключённые с помощью опций
auto_prepend_file и
auto_append_file
обрабатываются в этом режиме с некоторыми ограничениями,
например, функции должны быть объявлены до их использования.
Интерактивный режим
Если модуль readline недоступен, то до PHP 8.1.0 вызов файла &cli.sapi; с параметром обеспечивал интерактивный режим.
В этом режиме предполагается, что полный скрипт PHP передаётся через STDIN, а после завершения скрипт оценивается с помощью CRTL+d (POSIX) или CTRL+z с последующим ENTER (Windows).
По сути это то же самое, что и вызов &cli.sapi; без параметра .
option.
Начиная с PHP 8.1.0, вызов &cli.sapi; с параметром завершается ошибкой, если модуль readline недоступен.
Встроенный веб-сервер
Веб-сервер предназначен для помощи в разработке приложений. Он также может
быть полезным в тестовых целях или для демонстрации приложения, запускаемого
в полностью контролируемом окружении. Он не выполняет функции полноценного
веб-сервера и не должен использоваться в общедоступных сетях.
Модуль &cli.sapi; содержит встроенный веб-сервер.
Веб-сервер выполняет только один однопоточный процесс, поэтому приложения PHP
будут останавливаться, если запрос заблокирован.
URI-запросы обслуживаются из текущей директории, в которой был запущен PHP,
если не используется опция -t для явного указания корневого документа.
Если URI запроса не указывает на определённый файл, то будет возвращён
index.php или index.html в указанной директории. Если ни один из файлов не существует,
то поиск этих файлов будет продолжен в родительской директории и так далее до тех пор,
пока они не будут найдены или был достигнут корень документа. Если найден
index.php или index.html, он возвращается, а в $_SERVER['PATH_INFO'] будет
находится последняя часть URL. В противном случае возвращается 404 код ответа.
Если PHP-файл указывается в командной строке, когда запускается веб-сервер,
то он рассматривается как скрипт "маршрутизации" (router). Скрипт выполняется
в самом начале каждого HTTP-запроса. Если этот скрипт возвращает
&false;, то запрашиваемый ресурс возвращается как есть.
В противном случае браузеру будет возвращён вывод этого скрипта.
Стандартные MIME-типы возвращаются для файлов со следующими расширениями:
.3gp.apk.avi.bmp.css.csv.doc.docx.flac.gif.gz.gzip.htm.html.ics.jpe.jpeg.jpg.js.kml.kmz.m4a.mov.mp3.mp4.mpeg.mpg.odp.ods.odt.oga.ogg.ogv.pdf.png.pps.pptx.qt.svg.swf.tar.text.tif.txt.wav.webm.wmv.xls.xlsx.xml.xsl.xsd.zip
.
Начиная с PHP 7.4.0 встроенный веб-сервер можно настроить для разветвления
нескольких рабочих процессов для тестирования кода, который требует нескольких
одновременных запросов к встроенному веб-серверу.
Перед запуском сервера установите для переменной среды PHP_CLI_SERVER_WORKERS
количество желаемых рабочих процессов.
ОС Windows не поддерживает эту функцию.
Эта экспериментальная функция не
предназначена для производственного окружения. Обычно встроенный веб-сервер
не предназначен для производственного окружения.
Запуск веб-сервера
В консоли выведется:
После URI-запросов http://localhost:8000/ и http://localhost:8000/myscript.html
в консоли выведется примерно следующее:
Обратите внимание, что до PHP 7.4.0 статические ресурсы с символическими ссылками не были доступны в Windows, если только скрипт маршрутизатора не обработал бы их.
Запуск с указанием корневой директории
В консоли выведется:
Использование скрипта маршрутизации
В этом примере, запросы изображений будут отображать их, но запросы HTML-файлов
будут возвращать "Добро пожаловать в PHP".
Добро пожаловать в PHP";
}
?>]]>
Встроенный веб-сервер не должен использоваться в общедоступной сети.
Проверка использования веб-сервера CLI
Для совместного использования скрипта маршрутизации при разработке с
веб-сервером CLI и в дальнейшем с рабочим (production) веб-сервером:
]]>
Поддержка неподдерживаемых типов файлов
Если вам нужно обслуживать статические ресурсы с MIME-типами, неподдерживаемыми
веб-сервером CLI, используйте это:
]]>
Доступ к веб-серверу CLI с удалённых машин
Вы можете сделать веб-сервер доступным на 8000 порту для всех сетевых интерфейсов:
Опции конфигурации