Работа с PHP из командной строки Работа с PHP из командной строки
Введение Основная цель &cli.sapi; — разработка консольных приложений на PHP. &cli.sapi; содержит много отличий от других видов SAPI, которые объясняет эта глава. Обратите внимание, что &cli.sapi; и CGI — разные SAPI-интерфейсы, хотя в их поведении много общего. &cli.sapi; включается по умолчанию опцией , а отключается опцией при запуске команды ./configure. Имя, расположение и доступность бинарных модулей &cli; или CGI-интерфейса различаются в зависимости от способа установки PHP в систему. По умолчанию при выполнении команды make внутри директории с исходным кодом PHP в каталоге sapi/cgi/php-cgi создаётся модуль CGI, а в каталоге sapi/cli/php модуль &cli;. Обратите внимание, что оба файла модулей называются одинаково: php. Что произойдёт при выполнении make install, зависит от того, какие опции указали на стадии конфигурирования. Команда make install скопирует в каталог {PREFIX}/bin/php &cli;-модуль, если во время конфигурирования выбрали модуль SAPI наподобие apxs или указали опцию , иначе команда скопирует в эту директорию CGI-модуль. Например, с опцией команда make install скопирует в каталог {PREFIX}/bin/php &cli;-версию. После команды make install запускают команду make install-cli, когда требуется переопределить установку двоичного файла CGI-модуля, или как альтернативу указывают в строке конфигурации опцию . Опция в строке конфигурации не означает, что команда make install скопирует &cli; в каталог {PREFIX}/bin/php, поскольку опции и включены по умолчанию. Бинарный файл &cli; лежит в главном каталоге PHP-дистрибутива для Windows в виде файла php.exe, а CGI-версия — в виде файла php-cgi.exe. Кроме того, в дистрибутив входит файл php-win.exe, если PHP сконфигурировали с опцией . Этот файл эквивалентен &cli;-версии, за исключением того, что ничего не выводит, и поэтому при запуске файла не открывает окно Командной строки. Как узнать версию SAPI-интерфейса Вызов в командной оболочке команды php -v выведет информацию о том, запускается двоичный php-файл как CGI- или &cli;-версия SAPI-интерфейса. Информацию о SAPI-версии возвращают также функция php_sapi_name и константа PHP_SAPI. В Unix-системах страница руководства к интерфейсу CLI доступна при вызове команды man в командной оболочке: 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 часто выполняют расширенный, по сравнению со стандартными веб-скриптами, диапазон задач, и поскольку консольные скрипты часто выполняются долго, для директивы устанавливается значение 0 — бесконечное время выполнения скрипта. register_argc_argv &true; При установке значения &true; скрипты, которые выполняются через &cli; SAPI, получают доступ к переменной argc, которая содержит количество переданных приложению аргументов, и к переменной argv с массивом текущих аргументов. При работе в &cli; SAPI переменные $argc и $argv автоматически заполняются значениями. Эти значения также доступны в массиве $_SERVER, например: $_SERVER['argv']. Переменные $argv и $_SERVER['argv'] не относятся к надёжному признаку запуска скрипта из командной строки, поскольку при включённой директиве register_argc_argv переменные могли установить в других контекстах. Вместо этого проверяют значение, которое вернула функция php_sapi_name. 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>. Вместе с внутренней информацией об ошибке парсера в станадртный поток вывода записывается текст Errors parsing <filename>, если возникла ошибка. Опция присвоит коду возврата командной оболочки значение -1, если в заданных файлах или данных стандартного потока ввода возникли ошибки, иначе опция присвоит коду возврата командной оболочки значение 0. Опция не обнаружит фатальные ошибки в коде, который требует выполнения, наподобие вызова функций, которые не объявили. До PHP 8.3.0 для проверки разрешалось указывать только одно название файла. Опция не работает с опцией . -m --modules Вывод списка PHP- и Zend-модулей ядра, которые загрузили -r --run Разрешает выполнять PHP-код, который указали в командной строке. Открывающие и закрывающие PHP-теги (<?php и ?>) не нужны и вызовут синтаксическую ошибку. С этим ключом работают очень осторожно и избегают недоразумений, которые связаны с автоматической подстановкой переменных окружения. Ошибка синтаксиса при двойных кавычках Проблема здесь заключается в том, что командная оболочка bash выполняет автоматическую подстановку переменных в sh-командах, если указали двойные кавычки ". Поскольку маловероятно, что переменную $foo определили, переменная заменяется пустой строкой, что изменяет PHP-код, который передали для выполнения, вот так: Правильное решение в таких ситуациях состоит в указании одинарных кавычек ', поскольку автоматическая подстановка переменных, которые обернули в одинарные кавычки, в sh-командах оболочки bash не происходит. Одинарные кавычки, которые предотвращают подстановку переменных в консоли int(1) ["E_WARNING"]=> int(2) ["E_PARSE"]=> int(4) ["E_NOTICE"]=> int(8) ["E_CORE_ERROR"]=> [...] ]]> В оболочках, которые отличаются от оболочки bash и которые запускают sh-команды, иногда возникают другие проблемы. Тогда требуется создать отчёт о ошибке, которая возникла, на сайте &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 Получение информации о названия <acronym>SAPI</acronym>, PHP- и Zend-версии через опцию <option>-v</option> -w --strip Показывает исходный код без комментариев и пробелов. Опция несовместима с опцией . -z --zend-extension Загружает модуль Zend. PHP попытается загрузить модуль из текущего пути библиотеки по умолчанию в системе, который в Linux-системах обычно указывают в файле /etc/ld.so.conf, если передали только название файла. Передача файла с абсолютным путём не будет использовать системный путь поиска библиотеки. Относительное имя файла, которое содержит директорию, заставит 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-интерпретатор попытается обработать аргумент до выполнения скрипта как параметр команды. Аргументы скрипта указывают после разделителя списка аргументов --, чтобы не возникали ошибки интерпретации команды. После разбора разделителя PHP-интерпретатором следующие аргументы передаются в скрипт нетронутыми. [args...] [...] # Команда передаст аргумент '-h' в скрипт вместо вывода справки по параметрам PHP $ php -r 'var_dump($argv);' -- -h array(2) { [0]=> string(1) "-" [1]=> string(2) "-h" } ]]> При этом в Unix-системах доступен ещё один способ запуска PHP-скриптов из консоли. В первой строке такого скрипта указывают шебанг #! (от англ. hashbang) и корректный путь к бинарному файлу PHP &cli;: #!/usr/bin/php. После этой строки записывают стандартный 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-скрипт, принимающий один аргумент. Использование: В приведённом скрипте первая строка содержит шебанг, который указывает, что файл запускается 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. Начиная с PHP 8.4.0 установить путь к файлу с историей команд можно в переменной окружения PHP_HISTFILE. Модуль &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 обрабатываются в этом режиме с некоторыми ограничениями, например, функции должны быть объявлены до их использования.
Интерактивный режим До PHP 8.1.0 при недоступности модуля readline вызов файла &cli.sapi; с параметром запускал интерактивный режим. В этом режиме предполагается, что PHP-скрипт передадут целиком через стандартный входной поток STDIN, затем завершат ввод комбинацией клавиш CTRL D (в POSIX-системах) или комбинацией CTRL Z , за которой идёт клавиша ENTER (в ОС Windows), после чего скрипт обработается. По сути это то же самое, что и вызов &cli.sapi; без параметра . option. Начиная с PHP 8.1.0 при недоступности модуля readline вызов &cli.sapi; с параметром завершается ошибкой.
Встроенный веб-сервер Веб-сервер предназначен для помощи в разработке приложений. Он также может быть полезным в тестовых целях или для демонстрации приложения, запускаемого в полностью контролируемом окружении. Он не выполняет функции полноценного веб-сервера и не должен использоваться в общедоступных сетях. Модуль &cli.sapi; содержит встроенный веб-сервер. Веб-сервер выполняет только один однопоточный процесс, поэтому приложения PHP остановятся при блокировке запроса. URI-запросы обслуживаются из текущей директории, в которой запустили PHP, если не указали опцию -t для переназначения корневого документа. При запросе URI, который не указывает на конкретный файл, возвращается файл index.php или index.html в заданной директории. При недоступности файлов поиск файлов продолжается в родительской директории, и так далее, пока веб-сервер не найдёт файл или не достигнет корня документа. При обнаружении файла index.html веб-сервер возвращает содержимое файла, а при обнаружении файла index.php — возвращается результат обработки. При этом в элемент $_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 не поддерживает многопроцессный режим. Информацию о параметрах, которые поддерживает PHP в режиме командной строки, возвращают команды php --help или man php. PHP проигнорирует параметры командной строки, которые не сочетаются с параметром запуска веб-сервера. Встроенный веб-сервер — экспериментальная функция, которая не рассчитана на работу в производственном окружении; сервер запускают только в целях разработки. Запуск веб-сервера В консоли выведется: После 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 в выводе терминала встроенного веб-сервера.