Работа с 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 в консоли.
Основные отличия от остальных реализаций <acronym>SAPI</acronym> Основные отличия &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_time 0 (без ограничений) 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; не изменяет текущую директорию на директорию исполняемого скрипта. Пример, демонстрирующий разницу с <acronym>CGI</acronym> <acronym>SAPI</acronym>: ]]> В случае, если используется 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;. Синтаксис выглядит следующим образом: Пример команды с параметром <literal>-d</literal> для установки 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-код, выполняемый после обработки ввода. Использование опций <option>-B</option>, <option>-R</option> и <option>-E</option> для подсчёта количества строк в проекте. -S --server Запускает встроенный веб-сервер. -t --docroot Указывает корень документа для встроенного веб-сервера. -s --syntax-highlight и --syntax-highlighting Показать исходный код с подсветкой синтаксиса. Эта опция использует внутренний механизм для разбора файла и записи в стандартный поток вывода подсвеченной версии этого файла. Учтите, что все что она делает, это генерирует блок <code> [...] </code> HTML-тегов, без HTML-заголовков. Эта опция несовместима с опцией . -v --version Использование <option>-v</option> для получения типа <acronym>SAPI</acronym> и версии PHP и Zend -w --strip Показать исходный код без комментариев и пробелов. Эта опция несовместима с опцией . -z --zend-extension Загружает модуль Zend. Если передано только имя файла, PHP попытается загрузить этот модуль из пути библиотек по умолчанию (обычно указывается в /etc/ld.so.conf в системах Linux). Передача файла с абсолютным путём не будет использовать системный путь поиска библиотеки. Относительное имя файла, содержащее директорию, укажет PHP подгрузить модуль относительно текущей директории. --ini Показывает имена конфигурационных файлов и отсканированные директории. Пример <literal>--ini</literal> --rf --rfunction Показывает информацию об указанной функции или методе класса (например, количество и названия параметров). Эта опция доступна только в том случае, если PHP был скомпилирован с поддержкой Reflection. Базовое использование <literal>--rf</literal> public function var_dump ] { - Parameters [2] { Parameter #0 [ $var ] Parameter #1 [ $... ] } } ]]> --rc --rclass Показывает информацию об указанном классе (список констант, свойств и методов). Эта опция доступна только в том случае, если PHP был скомпилирован с поддержкой Reflection. Пример <literal>--rc</literal> 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. Пример <literal>--re</literal> extension #19 json version 1.2.1 ] { - Functions { Function [ function json_encode ] { } Function [ function json_decode ] { } } } ]]> --rz --rzendextension Показывает информацию о конфигурации указанного Zend-модуля (та же информация, которая возвращается phpinfo). --ri --rextinfo Показывает информацию о конфигурации указанного модуля (та же информация, которая возвращается phpinfo). Конфигурацию ядра можно узнать, указав в качестве имени модуля значение "main". Пример <literal>--ri</literal> 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 поддерживает несколько управляющих последовательностей: Управляющие последовательности <parameter>cli.prompt</parameter> Управляющая последовательность Описание \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 порту для всех сетевых интерфейсов:
Опции конфигурации Опции конфигурации CLI SAPI &Name; &Default; &Changeable; &Changelog; cli_server.color "0" INI_ALL
&ini.descriptions.title; cli_server.color bool Включает поддержку цветовых кодов ANSI в выводе терминала встроенного веб-сервера.