Работа с 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.
Основные отличия от остальных реализаций 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 часто выполняют расширенный,
по сравнению со стандартными веб-скриптами, диапазон задач,
и поскольку консольные скрипты часто выполняются долго,
для директивы устанавливается значение 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; не
изменяет текущую директорию на директорию исполняемого скрипта.
Пример, который показывает разницу с 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>.
Вместе с внутренней информацией об ошибке парсера
в станадртный поток вывода записывается текст
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-код, который требуется выполнить после обработки ввода.
Подсчёт количества строк в проекте
опциями , и
-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 попытается загрузить модуль из текущего пути библиотеки
по умолчанию в системе, который в Linux-системах обычно указывают
в файле /etc/ld.so.conf, если передали только название файла.
Передача файла с абсолютным путём не будет использовать
системный путь поиска библиотеки. Относительное имя файла, которое содержит
директорию, заставит 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-интерпретатор попытается обработать аргумент до выполнения скрипта
как параметр команды. Аргументы скрипта указывают
после разделителя списка аргументов --, чтобы не возникали ошибки интерпретации команды.
После разбора разделителя 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 поддерживает
несколько управляющих последовательностей:
Управляющие последовательности cli.promptУправляющая последовательностьОписание\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, затем завершат ввод комбинацией клавиш
CTRLD
(в POSIX-системах) или комбинацией
CTRLZ,
за которой идёт клавиша 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 для всех сетевых интерфейсов:
Опции конфигурации