1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files
archived-doc-ru/features/commandline.xml
2026-03-16 07:22:04 +03:00

2015 lines
82 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 96b10a98853e3b8236504e5775f95eb4a15c82c3 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="features.commandline" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Работа с PHP из командной строки</title>
<titleabbrev>Работа с PHP из командной строки</titleabbrev>
<!--Introduction: {{{-->
<section xml:id="features.commandline.introduction" annotations="chunk:false">
<title>Введение</title>
<para>
Основная цель &cli.sapi; — разработка консольных приложений на PHP.
&cli.sapi; содержит много отличий от других видов <acronym>SAPI</acronym>, которые
объясняет эта глава.
Обратите внимание, что &cli.sapi; и <acronym>CGI</acronym>
разные <acronym>SAPI</acronym>-интерфейсы, хотя в их поведении много общего.
</para>
<para>
&cli.sapi; включается по умолчанию опцией
<option role="configure">--enable-cli</option>, а отключается
опцией <option role="configure">--disable-cli</option> при запуске
команды <command>./configure</command>.
</para>
<para>
Имя, расположение и доступность бинарных модулей
&cli; или <acronym>CGI</acronym>-интерфейса различаются в зависимости
от способа установки PHP в систему. По умолчанию при выполнении
команды <command>make</command> внутри директории с исходным кодом PHP
в каталоге <filename>sapi/cgi/php-cgi</filename> создаётся модуль <acronym>CGI</acronym>,
а в каталоге <filename>sapi/cli/php</filename> модуль &cli;.
Обратите внимание, что оба файла модулей называются одинаково:
<filename>php</filename>.
Что произойдёт при выполнении <command>make install</command>,
зависит от того, какие опции указали на стадии
конфигурирования. Команда <command>make install</command> скопирует
в каталог <filename>{PREFIX}/bin/php</filename> &cli;-модуль,
если во время конфигурирования выбрали модуль <acronym>SAPI</acronym>
наподобие apxs или указали опцию <option role="configure">--disable-cgi</option>,
иначе команда скопирует в эту директорию <acronym>CGI</acronym>-модуль.
Например, с опцией <option role="configure">--with-apxs</option>
команда <command>make install</command> скопирует в каталог
<filename>{PREFIX}/bin/php</filename> &cli;-версию.
После команды <command>make install</command> запускают
команду <command>make install-cli</command>, когда требуется переопределить
установку двоичного файла <acronym>CGI</acronym>-модуля, или как альтернативу указывают
в строке конфигурации опцию <option role="configure">--disable-cgi</option>.
</para>
<note>
<para>
Опция <option role="configure">--enable-cli</option> в строке
конфигурации не означает, что команда <command>make install</command>
скопирует &cli; в каталог <filename>{PREFIX}/bin/php</filename>,
поскольку опции <option role="configure">--enable-cli</option>
и <option role="configure">--enable-cgi</option> включены
по умолчанию.
</para>
</note>
<para>
Бинарный файл &cli; лежит в главном каталоге PHP-дистрибутива для Windows
в виде файла <filename>php.exe</filename>, а <acronym>CGI</acronym>-версия —
в виде файла <filename>php-cgi.exe</filename>.
Кроме того, в дистрибутив входит файл <filename>php-win.exe</filename>,
если PHP сконфигурировали с опцией <option role="configure">--enable-cli-win32</option>.
Этот файл эквивалентен &cli;-версии, за исключением того, что ничего не выводит,
и поэтому при запуске файла не открывает окно Командной строки.
</para>
<note>
<title>Как узнать версию SAPI-интерфейса</title>
<para>
Вызов в командной оболочке команды <command>php -v</command>
выведет информацию о том, запускается двоичный <filename>php</filename>-файл
как <acronym>CGI</acronym>- или &cli;-версия SAPI-интерфейса.
Информацию о SAPI-версии возвращают также функция <function>php_sapi_name</function>
и константа <constant>PHP_SAPI</constant>.
</para>
</note>
<note>
<para>
В Unix-системах страница руководства к интерфейсу CLI
доступна при вызове команды <literal>man</literal>
в командной оболочке: <command>man php</command>.
</para>
</note>
</section>
<!--}}}-->
<!--Differences: {{{-->
<section xml:id="features.commandline.differences">
<title>Основные отличия от остальных реализаций <acronym>SAPI</acronym></title>
<para>
Основные отличия &cli;-версии <acronym>SAPI</acronym>-интерфейса от остальных реализаций
<acronym>SAPI</acronym>:
<itemizedlist>
<listitem>
<para>
В отличие от <acronym>CGI</acronym>-версии <acronym>SAPI</acronym>-интерфейса,
заголовки не пишутся в поток вывода.
</para>
<para>
Хотя в <acronym>CGI</acronym>-версии <acronym>SAPI</acronym>-интерфейса
предусмотрели способ подавления HTTP-заголовков, в &cli.sapi; заголовки
включить нельзя.
</para>
<para>
&cli; по умолчанию запускается в тихом режиме, тем не менее,
ключи <option>-q</option> и <option>--no-header</option>
сохранили для обратной совместимости, что разрешает
запускать старые <acronym>CGI</acronym>-скрипты.
</para>
<para>
Текущая директория не изменяется на рабочую директорию скрипта.
Ключи <option>-C</option> и <option>--no-chdir</option>
сохранили для обратной совместимости.
</para>
<para>
Сообщения об ошибках выдаются в текстовом режиме —
без <acronym>HTML</acronym>-форматирования.
</para>
</listitem>
<listitem>
<para>
Отдельные настройки файла &php.ini; переопределяются &cli.sapi;,
поскольку в них нет смысла при работе в командной строке:
</para>
<para>
<table>
<title>Переопределяемые директивы &php.ini;</title>
<tgroup cols="3">
<thead>
<row>
<entry>Директива</entry>
<entry>Значение по умолчанию в &cli;-версии <acronym>SAPI</acronym>-интерфейса</entry>
<entry>Комментарий</entry>
</row>
</thead>
<tbody>
<row>
<entry><link linkend="ini.html-errors">html_errors</link></entry>
<entry>&false;</entry>
<entry>
Значение по умолчанию равно &false;, поскольку в консоли неудобно читать
сообщения об ошибке с нагромождением неинтерпретируемых <acronym>HTML</acronym>-тегов.
</entry>
</row>
<row>
<entry><link linkend="ini.implicit-flush">implicit_flush</link></entry>
<entry>&true;</entry>
<entry>
В консоли часто требуется, чтобы вывод
функции <function>print</function>
или языковой конструкции <function>echo</function>
сбрасывался сразу, а не хранился в буфере. При этом
<link linkend="ref.outcontrol">буферизация вывода</link> по-прежнему поддерживается
для отложенного вывода или манипуляций с данными буфера.
</entry>
</row>
<row>
<entry><link linkend="ini.max-execution-time">max_execution_time</link></entry>
<entry>0 (без ограничений)</entry>
<entry>
В консольном режиме средствами PHP часто выполняют расширенный,
по сравнению со стандартными веб-скриптами, диапазон задач,
и поскольку консольные скрипты часто выполняются долго,
для директивы устанавливается значение 0 — бесконечное время выполнения скрипта.
</entry>
</row>
<row>
<entry><link linkend="ini.register-argc-argv">register_argc_argv</link></entry>
<entry>&true;</entry>
<entry>
<para>
При установке значения &true; скрипты,
которые выполняются через &cli; <acronym>SAPI</acronym>,
получают доступ к переменной <emphasis>argc</emphasis>, которая содержит количество переданных приложению аргументов,
и к переменной <emphasis>argv</emphasis> с массивом текущих аргументов.
</para>
<para>
При работе в &cli; <acronym>SAPI</acronym>
переменные <varname>$argc</varname> и <varname>$argv</varname>
автоматически заполняются значениями.
Эти значения также доступны в массиве <varname>$_SERVER</varname>,
например: <varname>$_SERVER['argv']</varname>.
</para>
<warning>
<para>
Переменные <varname>$argv</varname> и <varname>$_SERVER['argv']</varname>
не относятся к надёжному признаку запуска скрипта
из командной строки, поскольку при включённой директиве <link linkend="ini.register-argc-argv">register_argc_argv</link>
переменные могли установить в других контекстах.
Вместо этого проверяют значение, которое вернула
функция <function>php_sapi_name</function>.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
if (php_sapi_name() === 'cli') {
echo "Код запускается из командной строки!\n";
}
]]>
</programlisting>
</informalexample>
</para>
</warning>
</entry>
</row>
<row>
<entry><link linkend="ini.output-buffering">output_buffering</link></entry>
<entry>&false;</entry>
<entry>
<para>
Хотя для этой опции файла &php.ini; жёстко установили значение &false;,
функции <link linkend="book.outcontrol">буферизации вывода</link> по-прежнему
доступны.
</para>
</entry>
</row>
<row>
<entry><link linkend="ini.max-input-time">max_input_time</link></entry>
<entry>&false;</entry>
<entry>
<para>
PHP &cli; не поддерживает GET, POST или загрузку файлов.
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<para>
Эти директивы нельзя инициализировать другими значениями
из конфигурационного файла &php.ini; или любого другого, если другой файл указали.
Это ограничение связано с тем, что значения применяются
после обработки конфигурационных файлов. Тем не менее, эти значения
могут быть изменены во время работы скрипта (хотя это не имеет особого смысла
для всех них, например <link linkend="ini.register-argc-argv">register_argc_argv</link>).
</para>
</note>
<note>
<para>
Рекомендуется установить опцию
<link linkend="ini.ignore-user-abort">ignore_user_abort</link>
для скриптов, используемых из командной строки. За подробностями
обращайтесь к функции <function>ignore_user_abort</function>.
</para>
</note>
</listitem>
<listitem>
<para>
Для облегчения работы в окружении оболочки определили
несколько констант
для <link linkend="features.commandline.io-streams">потоков ввода-вывода</link>.
</para>
</listitem>
<listitem>
<para>
&cli.sapi; <emphasis role="strong">не</emphasis>
изменяет текущую директорию на директорию исполняемого скрипта.
</para>
<example>
<title>
Пример, который показывает разницу с <acronym>CGI</acronym>-режимом <acronym>SAPI</acronym>-интерфейса:
</title>
<programlisting role="php">
<![CDATA[
<?php
// Базовый тестовый скрипт с названием test.php
echo getcwd(), "\n";
]]>
</programlisting>
<para>
При работе в <acronym>CGI</acronym>-режиме результат работы будет таким:
</para>
<screen>
<![CDATA[
$ pwd
/tmp
$ php -q another_directory/test.php
/tmp/another_directory
]]>
</screen>
<para>
Это наглядно демонстрирует, что PHP изменяет
текущую директорию на директорию исполняемого скрипта.
</para>
<para>
Работа через &cli.sapi; даёт другой результат:
</para>
<screen>
<![CDATA[
$ pwd
/tmp
$ php -f another_directory/test.php
/tmp
]]>
</screen>
<para>
Это обеспечивает большую гибкость при написании консольных скриптов на PHP.
</para>
</example>
<note>
<para>
При запуске из командной строки с ключом <option>-C</option>
<acronym>CGI</acronym>-режим <acronym>SAPI</acronym>-интерфейса разрешает
получить поведение, которое аналогично поведению при работе через &cli.sapi;.
</para>
</note>
</listitem>
</itemizedlist>
</para>
</section>
<!--}}}-->
<!--Options: {{{-->
<section xml:id="features.commandline.options">
<title>Список опций командной строки</title>
<titleabbrev>Опции</titleabbrev>
<para>
Список опций командной строки, которые предоставляет PHP,
доступны для получения в любой момент при запуске PHP с ключом <option>-h</option>:
<screen>
<![CDATA[
Usage: php [options] [-f] <file> [--] [args...]
php [options] -r <code> [--] [args...]
php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
php [options] -- [args...]
php [options] -a
-a Run interactively
-c <path>|<file> 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 <file> Parse and execute <file>.
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-r <code> Run PHP <code> without using script tags <?..?>
-B <begin_code> Run PHP <begin_code> before processing input lines
-R <code> Run PHP <code> for every input line
-F <file> Parse and execute <file> for every input line
-E <end_code> Run PHP <end_code> after processing all input lines
-H Hide any passed arguments from external tools.
-S <addr>:<port> Run with built-in web server.
-t <docroot> Specify document root <docroot> for built-in web server.
-s Output HTML syntax highlighted source.
-v Version number
-w Output source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
args... Arguments passed to script. Use -- args when first argument
starts with - or script is read from stdin
--ini Show configuration file names
--rf <name> Show information about function <name>.
--rc <name> Show information about class <name>.
--re <name> Show information about extension <name>.
--rz <name> Show information about Zend extension <name>.
--ri <name> Show configuration for extension <name>.
]]>
</screen>
</para>
<para>
<table>
<title>Опции, которые доступны из командной строки</title>
<tgroup cols="2">
<thead>
<row>
<entry>Опция</entry>
<entry>Полное название</entry>
<entry>Описание</entry>
</row>
</thead>
<tbody>
<row>
<entry>-a</entry>
<entry>--interactive</entry>
<entry>
<para>
Запустить PHP в интерактивном режиме. Дополнительную информацию
даёт раздел «<link linkend="features.commandline.interactive">Интерактивная консоль</link>».
</para>
</entry>
</row>
<row>
<entry>-b</entry>
<entry>--bindpath</entry>
<entry>
<para>
Путь связывания библиотек (Bind Path) для внешнего режима FASTCGI Server
(параметр работает только в <acronym>CGI</acronym>-версии).
</para>
</entry>
</row>
<row>
<entry>-C</entry>
<entry>--no-chdir</entry>
<entry>
<para>
Не менять текущую директорию на директорию скрипта
(параметр работает только в <acronym>CGI</acronym>-версии).
</para>
</entry>
</row>
<row>
<entry>-q</entry>
<entry>--no-header</entry>
<entry>
<para>
Тихий режим. Подавляет вывод заголовков <acronym>HTTP</acronym>
(параметр работает только в <acronym>CGI</acronym>-версии).
</para>
</entry>
</row>
<row>
<entry>-T</entry>
<entry>--timing</entry>
<entry>
<para>
Измерить время выполнения скрипта, повторенного <varname>count</varname>
раз (параметр работает только в <acronym>CGI</acronym>-версии).
</para>
</entry>
</row>
<row>
<entry>-c</entry>
<entry>--php-ini</entry>
<entry>
<para>
Указывает, либо директорию, в которой требуется искать
конфигурационный файл &php.ini;, либо пользовательский
<literal>INI</literal>-файл (название которого может
отличаться от стандартного &php.ini;), например:
</para>
<para><informalexample>
<screen>
<![CDATA[
$ php -c /custom/directory/ my_script.php
$ php -c /custom/directory/custom-file.ini my_script.php
]]>
</screen>
</informalexample></para>
<para>
Если эта опция не указана, поиск &php.ini; будет осуществлён
в <link linkend="configuration.file">местах по умолчанию</link>.
</para>
</entry>
</row>
<row>
<entry>-n</entry>
<entry>--no-php-ini</entry>
<entry>
<para>
Полностью игнорировать &php.ini;.
</para>
</entry>
</row>
<row>
<entry>-d</entry>
<entry>--define</entry>
<entry>
<para>
Устанавливает пользовательское значение для каждой из
конфигурационных опций, доступных в &php.ini;. Синтаксис выглядит следующим образом:
<screen>
<![CDATA[
-d configuration_directive[=value]
]]>
</screen>
</para>
<para><example>
<title>Пример команды с параметром <literal>-d</literal> для установки INI-настройки</title>
<screen>
<![CDATA[
# Если значение опустили, соответствующей опции присвоится значение "1"
$ php -d max_execution_time
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"
# Указание пустого значения установит соответствующую опцию значением ""
php -d max_execution_time=
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(0) ""
# Конфигурационная переменная будет установлена любым значением, указанным после символа '='
$ php -d max_execution_time=20
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(2) "20"
$ php
-d max_execution_time=doesntmakesense
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(15) "doesntmakesense"
]]>
</screen>
</example></para>
</entry>
</row>
<row>
<entry>-e</entry>
<entry>--profile-info</entry>
<entry>
<para>
Включить режим расширенной информации
для отладчика или профайлера.
</para>
</entry>
</row>
<row>
<entry>-f</entry>
<entry>--file</entry>
<entry>
<para>
Разбирает и исполняет файл, который указали в параметре <option>-f</option>.
Параметр необязателен — достаточно
указать только название файла для запуска.
</para>
</entry>
</row>
<row>
<entry>-h и -?</entry>
<entry>--help и --usage</entry>
<entry>
Выводит список опций командной строки с однострочным описанием того, что они делают.
</entry>
</row>
<row>
<entry>-i</entry>
<entry>--info</entry>
<entry>
Вызывает функцию <function>phpinfo</function> и выводит результат работы функции.
При некорректной работе PHP рекомендуют выполнить команду <command>php -i</command>
и посмотреть, выводятся ли сообщения об ошибках до или вместо информационных таблиц.
При работе <acronym>CGI</acronym>-модуля учитывают, что команда выведет данные
в <acronym>HTML</acronym>-формате и поэтому вывод будет большим.
</entry>
</row>
<row>
<entry>-l</entry>
<entry>--syntax-check</entry>
<entry>
<para>
Проверяет синтаксис, но не выполняет PHP-код.
Обработаются входные данные стандартного входного потока, если название файла не указали,
иначе проверится каждое название файла.
При выполнении без ошибок в стандартный поток вывода записывается текст
<literal>No syntax errors detected in &lt;filename&gt;</literal>.
Вместе с внутренней информацией об ошибке парсера
в станадртный поток вывода записывается текст
<literal>Errors parsing &lt;filename&gt;</literal>,
если возникла ошибка.
Опция присвоит коду возврата командной оболочки значение <literal>-1</literal>,
если в заданных файлах или данных стандартного потока ввода возникли ошибки,
иначе опция присвоит коду возврата командной оболочки значение <literal>0</literal>.
</para>
<para>
Опция не обнаружит фатальные ошибки в коде, который требует выполнения,
наподобие вызова функций, которые не объявили.
</para>
<note>
<para>
До PHP 8.3.0 для проверки разрешалось указывать только одно название файла.
</para>
</note>
<note>
<para>
Опция не работает с опцией <option>-r</option>.
</para>
</note>
</entry>
</row>
<row>
<entry>-m</entry>
<entry>--modules</entry>
<entry>
<para><example>
<title>Вывод списка PHP- и Zend-модулей ядра, которые загрузили</title>
<screen>
<![CDATA[
$ php -m
[PHP Modules]
xml
tokenizer
standard
session
posix
pcre
overload
mysql
mbstring
ctype
[Zend Modules]
]]>
</screen>
</example></para>
</entry>
</row>
<row>
<entry>-r</entry>
<entry>--run</entry>
<entry>
<para>
Разрешает выполнять PHP-код, который указали
в командной строке. Открывающие и закрывающие
PHP-теги (<literal>&lt;?php</literal> и <literal>?&gt;</literal>)
<emphasis role="strong">не нужны</emphasis>
и вызовут синтаксическую ошибку.
</para>
<note>
<para>
С этим ключом работают очень осторожно и избегают
недоразумений, которые связаны с автоматической подстановкой переменных окружения.
</para>
<example>
<title>Ошибка синтаксиса при двойных кавычках</title>
<screen>
<![CDATA[
$ php -r "$foo = get_defined_constants();"
PHP Parse error: syntax error, unexpected '=' in Command line code on line 1
Parse error: syntax error, unexpected '=' in Command line code on line 1
]]>
</screen>
</example>
<para>
Проблема здесь заключается в том, что командная оболочка bash выполняет автоматическую
подстановку переменных в sh-командах, если указали двойные кавычки
<literal>"</literal>. Поскольку маловероятно, что переменную <varname>$foo</varname>
определили, переменная заменяется пустой строкой, что изменяет
PHP-код, который передали для выполнения, вот так:
</para>
<informalexample>
<screen>
<![CDATA[
$ php -r " = get_defined_constants();"
]]>
</screen>
</informalexample>
<para>
Правильное решение в таких ситуациях состоит в указании
одинарных кавычек <literal>'</literal>, поскольку автоматическая подстановка
переменных, которые обернули в одинарные кавычки, в sh-командах оболочки bash не происходит.
</para>
<example>
<title>Одинарные кавычки, которые предотвращают
подстановку переменных в консоли</title>
<screen>
<![CDATA[
$ php -r '$foo = get_defined_constants(); var_dump($foo);'
array(370) {
["E_ERROR"]=>
int(1)
["E_WARNING"]=>
int(2)
["E_PARSE"]=>
int(4)
["E_NOTICE"]=>
int(8)
["E_CORE_ERROR"]=>
[...]
]]>
</screen>
</example>
<para>
В оболочках, которые отличаются от оболочки bash и которые запускают sh-команды,
иногда возникают другие проблемы. Тогда требуется создать отчёт о ошибке, которая возникла, на сайте
<link xlink:href="&url.php.bugs;">&url.php.bugs;</link>.
С проблемами иногда сталкиваются при попытке получить доступ
к переменным оболочки или при работе с экранирующими обратными слешами.
Теперь вы предупреждены!
</para>
</note>
<note>
<para>
Ключ <option>-r</option> доступен в &cli.sapi;, но недоступен
в <emphasis>CGI</emphasis> <acronym>SAPI</acronym>.
</para>
</note>
<note>
<para>
Опция предназначена только для самого простого кода.
Поэтому некоторые конфигурационные директивы наподобие
<link linkend="ini.auto-prepend-file">auto_prepend_file</link>
и <link linkend="ini.auto-append-file">auto_append_file</link>
в этом режиме проигнорируются.
</para>
</note>
</entry>
</row>
<row>
<entry>-B</entry>
<entry>--process-begin</entry>
<entry>
<para>
PHP-код, который требуется выполнить перед обработкой стандартного потока ввода stdin.
</para>
</entry>
</row>
<row>
<entry>-R</entry>
<entry>--process-code</entry>
<entry>
<para>
PHP-код, который требуется выполнить для каждой строки ввода.
</para>
<para>
В этом режиме предусмотрели две специальные переменные:
<varname>$argn</varname> и <varname>$argi</varname>.
Переменная <varname>$argn</varname> содержит строку, которую PHP
обрабатывает в текущий момент, а переменная <varname>$argi</varname>
содержит номер этой строки.
</para>
</entry>
</row>
<row>
<entry>-F</entry>
<entry>--process-file</entry>
<entry>
<para>
PHP-файл, который требуется выполнить для каждой строки ввода.
</para>
</entry>
</row>
<row>
<entry>-E</entry>
<entry>--process-end</entry>
<entry>
<para>
PHP-код, который требуется выполнить после обработки ввода.
</para>
<para><example>
<title>
Подсчёт количества строк в проекте
опциями <option>-B</option>, <option>-R</option> и <option>-E</option>
</title>
<screen>
<![CDATA[
$ find my_proj | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Всего строк: $l\n";'
Всего строк: 37328
]]>
</screen>
</example></para>
</entry>
</row>
<row>
<entry>-S</entry>
<entry>--server</entry>
<entry>
<para>
Запускает <link linkend="features.commandline.webserver">встроенный веб-сервер</link>.
</para>
</entry>
</row>
<row>
<entry>-t</entry>
<entry>--docroot</entry>
<entry>
Указывает корень документа
для <link linkend="features.commandline.webserver">встроенного веб-сервера</link>.
</entry>
</row>
<row>
<entry>-s</entry>
<entry>--syntax-highlight и --syntax-highlighting</entry>
<entry>
<para>
Показывает исходный код с подсветкой синтаксиса.
</para>
<para>
Эта опция использует внутренний механизм для разбора файла
и записи в стандартный поток вывода подсвеченной версии
этого файла. Учтите, что опция только генерирует
блок <literal>&lt;code&gt; [...] &lt;/code&gt;</literal>
HTML-тегов, без HTML-заголовков.
</para>
<note>
<para>
Опция несовместима с опцией <option>-r</option>.
</para>
</note>
</entry>
</row>
<row>
<entry>-v</entry>
<entry>--version</entry>
<entry>
<para><example>
<title>
Получение информации о названия <acronym>SAPI</acronym>,
PHP- и Zend-версии через опцию <option>-v</option>
</title>
<screen>
<![CDATA[
$ php -v
PHP 5.3.1 (cli) (built: Dec 11 2009 19:55:07)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
]]>
</screen>
</example></para>
</entry>
</row>
<row>
<entry>-w</entry>
<entry>--strip</entry>
<entry>
<para>
Показывает исходный код без комментариев и пробелов.
</para>
<note>
<para>
Опция несовместима с опцией <option>-r</option>.
</para>
</note>
</entry>
</row>
<row>
<entry>-z</entry>
<entry>--zend-extension</entry>
<entry>
<para>
Загружает модуль Zend. PHP попытается загрузить модуль из текущего пути библиотеки
по умолчанию в системе, который в Linux-системах обычно указывают
в файле <filename>/etc/ld.so.conf</filename>, если передали только название файла.
Передача файла с абсолютным путём не будет использовать
системный путь поиска библиотеки. Относительное имя файла, которое содержит
директорию, заставит PHP загрузить модуль относительно
текущей директории.
</para>
</entry>
</row>
<row>
<entry></entry>
<entry>--ini</entry>
<entry>
<para>
Показывает имена файлов конфигурации и просканированные каталоги.
<example>
<title>Пример <literal>--ini</literal></title>
<programlisting role="shell">
<![CDATA[
$ php --ini
Configuration File (php.ini) Path: /usr/dev/php/5.2/lib
Loaded Configuration File: /usr/dev/php/5.2/lib/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)
]]>
</programlisting>
</example>
</para>
</entry>
</row>
<row>
<entry>--rf</entry>
<entry>--rfunction</entry>
<entry>
<para>
Показывает информацию о функции или методе
класса (например, количество и названия параметров).
</para>
<para>
Опция доступна, только если PHP скомпилировали
с поддержкой интерфейса <link linkend="book.reflection">Reflection</link>.
</para>
<para>
<example>
<title>Пример базового поведения опции <literal>--rf</literal></title>
<programlisting role="shell">
<![CDATA[
$ php --rf var_dump
Function [ <internal> public function var_dump ] {
- Parameters [2] {
Parameter #0 [ <required> $var ]
Parameter #1 [ <optional> $... ]
}
}
]]>
</programlisting>
</example>
</para>
</entry>
</row>
<row>
<entry>--rc</entry>
<entry>--rclass</entry>
<entry>
<para>
Показывает информацию об классе; выводит
список констант, свойств и методов.
</para>
<para>
Опция доступна, только если PHP скомпилировали
с поддержкой интерфейса <link linkend="book.reflection">Reflection</link>.
</para>
<para>
<example>
<title>Пример вывода опции <literal>--rc</literal></title>
<programlisting role="shell">
<![CDATA[
$ php --rc Directory
Class [ <internal:standard> class Directory ] {
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [0] {
}
- Methods [3] {
Method [ <internal> public method close ] {
}
Method [ <internal> public method rewind ] {
}
Method [ <internal> public method read ] {
}
}
}
]]>
</programlisting>
</example>
</para>
</entry>
</row>
<row>
<entry>--re</entry>
<entry>--rextension</entry>
<entry>
<para>
Показывает информацию о модуле; выводит
список опций файла &php.ini;, функций, которые объявили, констант
и классов.
</para>
<para>
Опция доступна, только если PHP скомпилировали
с поддержкой интерфейса <link linkend="book.reflection">Reflection</link>.
</para>
<para>
<example>
<title>Пример вывода опции <literal>--re</literal></title>
<programlisting role="shell">
<![CDATA[
$ php --re json
Extension [ <persistent> extension #19 json version 1.2.1 ] {
- Functions {
Function [ <internal> function json_encode ] {
}
Function [ <internal> function json_decode ] {
}
}
}
]]>
</programlisting>
</example>
</para>
</entry>
</row>
<row>
<entry>--rz</entry>
<entry>--rzendextension</entry>
<entry>
<para>
Показывает информацию о конфигурации Zend-модуля —
та же информация, которая возвращается функцией <function>phpinfo</function>.
</para>
</entry>
</row>
<row>
<entry>--ri</entry>
<entry>--rextinfo</entry>
<entry>
<para>
Показывает информацию о конфигурации указанного модуля
(та же информация, которая возвращается <function>phpinfo</function>).
Конфигурацию ядра можно узнать, указав в качестве имени
модуля значение "main".
</para>
<para>
<example>
<title>Пример <literal>--ri</literal></title>
<programlisting role="shell">
<![CDATA[
$ php --ri date
date
date/time support => 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
]]>
</programlisting>
</example>
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<para>
Опции <literal>-rBRFEH</literal>, <literal>--ini</literal> и
<literal>--r[fcezi]</literal> доступны только в &cli;.
</para>
</note>
</section>
<!--}}}-->
<!--Usage: {{{-->
<section xml:id="features.commandline.usage">
<title>Выполнение PHP-файлов</title>
<titleabbrev>Использование</titleabbrev>
<para>
В &cli.sapi; есть три различных способа запуска PHP-кода:
<orderedlist>
<listitem>
<para>
Указание конкретного файла для запуска.
</para>
<informalexample>
<screen>
<![CDATA[
$ php my_script.php
$ php -f my_script.php
]]>
</screen>
</informalexample>
<para>
Оба способа — с опцией <option>-f</option> или без — запустят
файл <filename>my_script.php</filename>. Нет ограничений, какой
файл запускать; в частности, файлам даже не требуется
содержать расширение <literal>.php</literal>.
</para>
</listitem>
<listitem>
<para>
Передача PHP-кода для выполнения в командной строке.
</para>
<informalexample>
<screen>
<![CDATA[
$ php -r 'print_r(get_defined_constants());'
]]>
</screen>
</informalexample>
<para>
При работе в этом режиме соблюдают осторожность
из-за риска подстановки значений переменных оболочки в переменные в двойных кавычках.
</para>
<note>
<para>
Внимательно прочтите пример: код не содержит открывающих и закрывающих тегов!
Опции <option>-r</option> теги не требуются, и даже
вызовут ошибку разбора.
</para>
</note>
</listitem>
<listitem>
<para>
Передать запускаемый PHP-код через стандартный поток ввода
(<literal>stdin</literal>).
</para>
<para>
Это даёт мощную возможность создавать PHP-код и
передавать его запускаемому файлу, как показано в этом
(вымышленном) примере:
</para>
<informalexample>
<screen>
<![CDATA[
$ some_application | some_filter | php | sort -u > final_output.txt
]]>
</screen>
</informalexample>
</listitem>
</orderedlist>
Вы не можете комбинировать любой из этих трёх способов запуска кода.
</para>
<para>
Как и любое другое консольное приложение бинарный файл PHP
принимает аргументы, но PHP-скрипт также получает
аргументы. PHP не ограничивает количество аргументов,
передаваемых в скрипт (оболочка консоли устанавливает
некоторый порог количества символов, которые могут передать;
обычно этого лимита хватает). Переданные аргументы доступны
в глобальном массиве <varname>$argv</varname>. Первый индекс —
ноль — содержит название скрипта, который вызвали из командной строки.
Учтите, что если код вызывается из командной
строки на лету с опцией <option>-r</option>, значением
элемента <varname>$argv[0]</varname> будет <literal>«Стандартный поток»</literal> (Standard input code);
до PHP 7.2.0 это был дефис (<literal>"-"</literal>). То же самое верно и для кода,
переданного через конвейер из <constant>STDIN</constant>.
</para>
<para>
Вторая зарегистрированная глобальная переменная —
<varname>$argc</varname>, которая содержит количество элементов
в массиве <varname>$argv</varname>,
а <emphasis role="strong">не</emphasis> количество аргументов,
которые передали скрипту.
</para>
<para>
В режиме командной строки PHP поддерживает передачу аргументов скрипту без символа <literal>-</literal>.
При передаче в скрипт аргумента, перед которым указали символ <literal>-</literal>,
возникнет ошибка, поскольку PHP-интерпретатор попытается обработать аргумент до выполнения скрипта
как параметр команды. Аргументы скрипта указывают
после разделителя списка аргументов <literal>--</literal>, чтобы не возникали ошибки интерпретации команды.
После разбора разделителя PHP-интерпретатором следующие
аргументы передаются в скрипт нетронутыми.
</para>
<informalexample>
<screen>
<![CDATA[
# Команда не запустит код, а выведет информацию о параметрах командной строки, которые поддерживает PHP
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]
# Команда передаст аргумент '-h' в скрипт вместо вывода справки по параметрам PHP
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
]]>
</screen>
</informalexample>
<para>
При этом в Unix-системах доступен ещё один способ запуска
PHP-скриптов из консоли. В первой строке такого скрипта
указывают шебанг #! (от англ. hashbang) и корректный путь
к бинарному файлу PHP &cli;: <literal>#!/usr/bin/php</literal>.
После этой строки записывают стандартный PHP-код,
обрамлённый открывающим и закрывающим PHP-тегами. Сразу после установки
корректных атрибутов запуска на файл,
например <command>chmod +x test</command>), скрипт станет готов
к запуску как стандартный консольный или perl-скрипт:
</para>
<example>
<title>Запуск PHP-скрипта как консольного</title>
<programlisting role="php">
<![CDATA[
#!/usr/bin/php
<?php
var_dump($argv);
?>
]]>
</programlisting>
<para>
Предполагая, что этот файл назван <filename>test</filename>
и находится в текущей директории, можно сделать следующее:
</para>
<screen>
<![CDATA[
$ chmod +x test
$ ./test -h -- foo
array(4) {
[0]=>
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
]]>
</screen>
</example>
<para>
Как можно увидеть, в этом случае не нужно заботиться о
передаче параметров, которые начинаются с <literal>-</literal>.
</para>
<para>
Исполняемый PHP-файл может использоваться для запуска PHP-скриптов
независимо от веб-сервера. В случае работы в Unix-подобной системе,
необходимо добавить в первую строку файла <literal>#!</literal> (называемый также "shebang")
чтобы указать, какая из программ должна запускать скрипт.
На Windows-платформах можно назначить обработчик <filename>php.exe</filename> для файлов
с расширениями <literal>.php</literal> или создать пакетный
(.bat) файл для запуска скриптов посредством PHP.
Строка, добавляемая в начале скрипта для Unix-систем,
не влияет на их работу в ОС Windows, таким образом можно
создавать кросс-платформенные скрипты. Ниже приведён простой
пример скрипта, который выполняется из командной строки:
</para>
<para>
<example>
<title>Скрипт для запуска из командной строки (script.php)</title>
<programlisting role="php">
<![CDATA[
#!/usr/bin/php
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
Это консольный PHP-скрипт, принимающий один аргумент.
Использование:
<?php echo $argv[0]; ?> <option>
<option> Любое слово, которое вы хотели бы
напечатать. Опции --help, -help, -h,
или -? покажут текущую справочную информацию.
<?php
} else {
echo $argv[1];
}
?>
]]>
</programlisting>
</example>
</para>
<para>
В приведённом скрипте первая строка содержит шебанг,
который указывает, что файл запускается PHP. Работа ведётся с &cli;-версией,
поэтому не будет выведено ни одного <acronym>HTTP</acronym>-заголовка.
</para>
<para>
Скрипт сначала проверяет наличие обязательного одного аргумента (в дополнение к
имени скрипта, который также подсчитывается). Если их нет, или если переданный
аргумент был <option>--help</option>, <option>-help</option>,
<option>-h</option> или <option>-?</option>, выводится
справочное сообщение с использованием <varname>$argv[0]</varname>, которое содержит
имя выполняемого скрипта. В противном случае просто выводится полученный аргумент.
</para>
<para>
Для запуска приведённого примера в Unix-системе, нужно сделать
его исполняемым и просто выполнить в консоли
<command>script.php echothis</command> или
<command>script.php -h</command>. В Windows-системе можно
создать пакетный файл:
</para>
<para>
<example>
<title>Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)</title>
<programlisting role="winbat">
<![CDATA[
@echo OFF
"C:\php\php.exe" script.php %*
]]>
</programlisting>
</example>
</para>
<para>
Предполагая, что вышеприведённый скрипт называется
<filename>script.php</filename>, а полный путь к &cli;
<filename>php.exe</filename> находится в
<filename>C:\php\php.exe</filename>, этот пакетный файл
запустит его с переданными параметрами:
<command>script.bat echothis</command> или
<command>script.bat -h</command>.
</para>
<para>
Также можно ознакомиться с модулем
<link linkend="ref.readline">Readline</link> для получения
дополнительных функций, которые можно использовать для улучшения
консольного PHP-скрипта.
</para>
<para>
В Windows запуск PHP можно настроить без
необходимости указывать <filename>C:\php\php.exe</filename> или
расширение <literal>.php</literal>.
Подробнее эта тема описана в разделе
<link linkend="install.windows.commandline">Запуск PHP из
командной строки в Microsoft Windows</link>.
</para>
<note>
<para>
В Windows рекомендуется запускать PHP под актуальной учётной записью пользователя.
При работе в сетевой службе отдельные операции не выполняются,
поскольку «сопоставление имён учётных записей и идентификаторов безопасности не выполнено».
</para>
</note>
</section>
<!--}}}-->
<!--I/O Streams: {{{-->
<section xml:id="features.commandline.io-streams">
<title>Потоки ввода-вывода</title>
<titleabbrev>Потоки ввода-вывода</titleabbrev>
<para>
Модуль &cli.sapi; определяет набор констант для потоков
ввода-вывода, чтобы упростить работу с командной строкой.
</para>
<para>
<table>
<title>Константы, специфичные для модуля CLI</title>
<tgroup cols="2">
<thead>
<row>
<entry>Константа</entry>
<entry>Описание</entry>
</row>
</thead>
<tbody>
<row>
<entry><constant>STDIN</constant></entry>
<entry>
<para>Уже открытый поток ввода (<literal>stdin</literal>).
Это предотвращает необходимость его открывать следующим способом:
<programlisting role="php">
<![CDATA[
<?php
$stdin = fopen('php://stdin', 'r');
?>
]]>
</programlisting>
Если вы хотите прочесть одну строку из <literal>stdin</literal>,
можно использовать следующий код:
<programlisting role="php">
<![CDATA[
<?php
$line = trim(fgets(STDIN)); // читает одну строку из STDIN
fscanf(STDIN, "%d\n", $number); // читает число из STDIN
?>
]]>
</programlisting>
</para></entry>
</row>
<row>
<entry><constant>STDOUT</constant></entry>
<entry><para>
Уже открытый поток вывода (<literal>stdout</literal>).
Это предотвращает необходимость его открывать следующим способом:
<programlisting role="php">
<![CDATA[
<?php
$stdout = fopen('php://stdout', 'w');
?>
]]>
</programlisting>
</para></entry>
</row>
<row>
<entry><constant>STDERR</constant></entry>
<entry>
<para>
Уже открытый поток ошибок (<literal>stderr</literal>).
Это предотвращает необходимость его открывать следующим способом:
<programlisting role="php">
<![CDATA[
<?php
$stderr = fopen('php://stderr', 'w');
?>
]]>
</programlisting>
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
Учитывая вышесказанное, нет необходимости самому открывать поток,
например, <literal>stderr</literal>, а можно просто
использовать уже определённую константу ресурса потока:
<programlisting role="shell">
<![CDATA[
php -r 'fwrite(STDERR, "stderr\n");'
]]>
</programlisting>
PHP закроет поток автоматически при завершении работы скрипта,
поэтому закрывать поток вручную не требуется.
</para>
<note>
<para>
Эти константы недоступны, если PHP-скрипт считывается
из потока <literal>stdin</literal>.
</para>
</note>
</section>
<!--}}}-->
<!--Interactive shell: {{{-->
<section xml:id="features.commandline.interactive">
<title>Интерактивная консоль</title>
<para>
Модуль &cli.sapi; поддерживает интерактивную консоль, которую запускает
опция <option>-a</option>, если PHP скомпилировали с параметром
<option role="configure">--with-readline</option>.
Начиная с PHP PHP 7.1.0 интерактивная консоль также доступна в ОС Windows,
если <link linkend="book.readline">модуль readline</link> включили.
</para>
<para>
Интерактивная консоль умеет принимать и выполнять сам PHP-код.
</para>
<example>
<title>Запуск кода в интерактивной консоли</title>
<programlisting role="shell">
<![CDATA[
$ php -a
Interactive shell
php > echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >
]]>
</programlisting>
</example>
<para>
Интерактивная консоль при нажатии клавиши Tab также автодополняет
названия функций, констант, классов, переменных, вызовы
статических методов и константы классов.
</para>
<example>
<title>Автодополнение по клавише Tab</title>
<simpara>
Двойное нажатие клавиши Tab покажет список вариантов,
если доступно больше одного варианта дополнения:
</simpara>
<programlisting role="shell">
<![CDATA[
php > strp[TAB][TAB]
strpbrk strpos strptime
php > strp
]]>
</programlisting>
<simpara>
Когда есть только одно дополнение, одиночное нажатие
Tab дополнит оставшийся текст на той же самой строке:
</simpara>
<programlisting role="shell">
<![CDATA[
php > strpt[TAB]ime(
]]>
</programlisting>
<simpara>
Дополнение также работает для имён, которые объявили
в течение текущей интерактивной сессии:
</simpara>
<programlisting role="shell">
<![CDATA[
php > $fooThisIsAReallyLongVariableName = 42;
php > $foo[TAB]ThisIsAReallyLongVariableName
]]>
</programlisting>
</example>
<simpara>
Интерактивная оболочка хранит историю команд, для доступа к которой
нажимают стрелки вверх и вниз.
История хранится в файле <filename>~/.php_history</filename>.
Начиная с PHP 8.4.0 установить путь к файлу с историей команд можно
в переменной окружения <envar>PHP_HISTFILE</envar>.
</simpara>
<para>
Модуль &cli.sapi; поддерживает две новые настройки в файле &php.ini;:
<parameter>cli.pager</parameter> и <parameter>cli.prompt</parameter>.
Директива <parameter>cli.pager</parameter> разрешает использовать
внешнюю программу наподобие <filename>less</filename>
для постраничного просмотра, а не прямого вывода данных на экран.
Настройка <parameter>cli.prompt</parameter> разрешает задавать
приглашение <literal>php &gt;</literal> на ввод команды.
</para>
<para>
В интерактивной консоли также разрешается устанавливать настройки
файла &php.ini; через специальное сокращение.
</para>
<example>
<title>Установка настройки файла &php.ini; в интерактивной консоли</title>
<simpara>
Настройка <parameter>cli.prompt</parameter>:
</simpara>
<programlisting role="shell">
<![CDATA[
php > #cli.prompt=hello world :>
hello world :>
]]>
</programlisting>
<simpara>
Обратными кавычками задают PHP-код, который
выполнится в приглашении на ввод команды:
</simpara>
<programlisting role="shell">
<![CDATA[
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 >
]]>
</programlisting>
<simpara>
Установка <filename>less</filename> для постраничного вывода данных:
</simpara>
<programlisting role="shell">
<![CDATA[
php > #cli.pager=less
php > phpinfo();
(output displayed in less)
php >
]]>
</programlisting>
</example>
<para>
Настройка <parameter>cli.prompt</parameter> поддерживает
несколько управляющих последовательностей:
<table>
<title>Управляющие последовательности <parameter>cli.prompt</parameter></title>
<tgroup cols="2">
<thead>
<row>
<entry>Управляющая последовательность</entry>
<entry>Описание</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>\e</literal></entry>
<entry>
Используется для добавления цветов в приглашение на ввод команды.
Пример: <literal>\e[032m\v \e[031m\b \e[34m\> \e[0m</literal>
</entry>
</row>
<row>
<entry><literal>\v</literal></entry>
<entry>Версия PHP.</entry>
</row>
<row>
<entry><literal>\b</literal></entry>
<entry>
Отображает в какой части PHP мы находимся. Для примера <literal>/*</literal>
показывает, что мы находимся в многострочном комментарии. Внешняя область
видимости обозначается как <literal>php</literal>.
</entry>
</row>
<row>
<entry><literal>\&gt;</literal></entry>
<entry>
Указывает символ приглашения. По умолчанию это символ <literal>&gt;</literal>,
но можно изменить, когда оболочка находится внутри незакрытого блока или строки.
Возможные символы: <literal>' " { ( &gt;</literal>
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<para>
Файлы, подключённые с помощью опций
<link linkend="ini.auto-prepend-file">auto_prepend_file</link> и
<link linkend="ini.auto-append-file">auto_append_file</link>
обрабатываются в этом режиме с некоторыми ограничениями,
например, функции должны быть объявлены до их использования.
</para>
</note>
<section xml:id="features.commandline.interactive.mode">
<title>Интерактивный режим</title>
<para>
До PHP 8.1.0 при недоступности модуля readline вызов файла &cli.sapi;
с параметром <option>-a</option> запускал интерактивный режим.
В этом режиме предполагается, что PHP-скрипт передадут целиком через стандартный
входной поток STDIN, затем завершат ввод комбинацией клавиш
<keycombo action='simul'>
<keycap>CTRL</keycap>
<keycap>D</keycap>
</keycombo>
(в POSIX-системах) или комбинацией
<keycombo action='simul'>
<keycap>CTRL</keycap>
<keycap>Z</keycap>
</keycombo>,
за которой идёт клавиша <literal>ENTER</literal>ОС Windows), после чего скрипт обработается.
По сути это то же самое, что и вызов &cli.sapi; без параметра <option>-a</option>.
option.
</para>
<para>
Начиная с PHP 8.1.0 при недоступности модуля readline вызов &cli.sapi;
с параметром <option>-a</option> завершается ошибкой.
</para>
</section>
</section>
<!--}}}-->
<!--Built-in CLI Web Server: {{{-->
<section xml:id="features.commandline.webserver">
<title>Встроенный веб-сервер</title>
<warning>
<para>
Веб-сервер предназначен для помощи в разработке приложений. Он также может
быть полезным в тестовых целях или для демонстрации приложения, запускаемого
в полностью контролируемом окружении. Он не выполняет функции полноценного
веб-сервера и не должен использоваться в общедоступных сетях.
</para>
</warning>
<para>
Модуль &cli.sapi; содержит встроенный веб-сервер.
</para>
<para>
Веб-сервер выполняет только один однопоточный процесс, поэтому приложения PHP
остановятся при блокировке запроса.
</para>
<para>
URI-запросы обслуживаются из текущей директории, в которой запустили PHP,
если не указали опцию -t для переназначения корневого документа.
При запросе URI, который не указывает на конкретный файл, возвращается
файл index.php или index.html в заданной директории. При недоступности файлов
поиск файлов продолжается в родительской директории, и так далее,
пока веб-сервер не найдёт файл или не достигнет корня документа. При обнаружении
файла index.html веб-сервер возвращает содержимое файла, а при обнаружении файла index.php — возвращается результат обработки.
При этом в элемент $_SERVER['PATH_INFO']
записывается последняя часть URL-адреса, иначе возвращается 404-й код ответа.
</para>
<para>
Если PHP-файл указывается в командной строке, когда запускается веб-сервер,
то он рассматривается как скрипт "маршрутизации" (router). Скрипт выполняется
в самом начале каждого HTTP-запроса. Если этот скрипт возвращает
&false;, то запрашиваемый ресурс возвращается как есть.
В противном случае браузеру будет возвращён вывод этого скрипта.
</para>
<para>
Стандартные MIME-типы возвращаются для файлов со следующими расширениями:
<simplelist type="inline">
<member><literal>.3gp</literal></member>
<member><literal>.apk</literal></member>
<member><literal>.avi</literal></member>
<member><literal>.bmp</literal></member>
<member><literal>.css</literal></member>
<member><literal>.csv</literal></member>
<member><literal>.doc</literal></member>
<member><literal>.docx</literal></member>
<member><literal>.flac</literal></member>
<member><literal>.gif</literal></member>
<member><literal>.gz</literal></member>
<member><literal>.gzip</literal></member>
<member><literal>.htm</literal></member>
<member><literal>.html</literal></member>
<member><literal>.ics</literal></member>
<member><literal>.jpe</literal></member>
<member><literal>.jpeg</literal></member>
<member><literal>.jpg</literal></member>
<member><literal>.js</literal></member>
<member><literal>.kml</literal></member>
<member><literal>.kmz</literal></member>
<member><literal>.m4a</literal></member>
<member><literal>.mov</literal></member>
<member><literal>.mp3</literal></member>
<member><literal>.mp4</literal></member>
<member><literal>.mpeg</literal></member>
<member><literal>.mpg</literal></member>
<member><literal>.odp</literal></member>
<member><literal>.ods</literal></member>
<member><literal>.odt</literal></member>
<member><literal>.oga</literal></member>
<member><literal>.ogg</literal></member>
<member><literal>.ogv</literal></member>
<member><literal>.pdf</literal></member>
<member><literal>.png</literal></member>
<member><literal>.pps</literal></member>
<member><literal>.pptx</literal></member>
<member><literal>.qt</literal></member>
<member><literal>.svg</literal></member>
<member><literal>.swf</literal></member>
<member><literal>.tar</literal></member>
<member><literal>.text</literal></member>
<member><literal>.tif</literal></member>
<member><literal>.txt</literal></member>
<member><literal>.wav</literal></member>
<member><literal>.webm</literal></member>
<member><literal>.wmv</literal></member>
<member><literal>.xls</literal></member>
<member><literal>.xlsx</literal></member>
<member><literal>.xml</literal></member>
<member><literal>.xsl</literal></member>
<member><literal>.xsd</literal></member>
<member><literal>.zip</literal></member>
</simplelist>
.
</para>
<simpara>
Начиная с PHP 7.4.0 встроенный веб-сервер получил поддержку
многопроцессного режима работы для тестирования кода, который требует нескольких
одновременных запросов к встроенному веб-серверу.
Перед запуском сервера для переменной среды <envar>PHP_CLI_SERVER_WORKERS</envar>
устанавливают количество рабочих процессов, которое требуется для тестирования.
</simpara>
<note>
<simpara>ОС Windows не поддерживает многопроцессный режим.</simpara>
</note>
<note>
<simpara>
Информацию о параметрах, которые поддерживает PHP в режиме командной строки,
возвращают команды <command>php --help</command> или <command>man php</command>.
PHP проигнорирует параметры командной строки, которые не сочетаются с параметром запуска веб-сервера.
</simpara>
</note>
<warning>
<para>
Встроенный веб-сервер — <emphasis>экспериментальная</emphasis> функция,
которая <emphasis>не</emphasis> рассчитана на работу в производственном окружении;
сервер запускают <emphasis>только</emphasis> в целях разработки.
</para>
</warning>
<example>
<title>Запуск веб-сервера</title>
<programlisting role="shell">
<![CDATA[
$ cd ~/public_html
$ php -S localhost:8000
]]>
</programlisting>
<para>
В консоли выведется:
</para>
<screen>
<![CDATA[
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit
]]>
</screen>
<para>
После URI-запросов http://localhost:8000/ и http://localhost:8000/myscript.html
в консоли выведется примерно следующее:
</para>
<screen>
<![CDATA[
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit.
[Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Request read
[Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Request read
[Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Request read
[Thu Jul 21 10:48:52 2011] ::1:39148 GET /myscript.html - Request read
[Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Request read
]]>
</screen>
<para>
Обратите внимание, что до PHP 7.4.0 статические ресурсы с символическими ссылками не были доступны в Windows, если только скрипт маршрутизатора не обработал бы их.
</para>
</example>
<example>
<title>Запуск с указанием корневой директории</title>
<programlisting role="shell">
<![CDATA[
$ cd ~/public_html
$ php -S localhost:8000 -t foo/
]]>
</programlisting>
<para>
В консоли выведется:
</para>
<screen>
<![CDATA[
PHP 5.4.0 Development Server started at Thu Jul 21 10:50:26 2011
Listening on localhost:8000
Document root is /home/me/public_html/foo
Press Ctrl-C to quit
]]>
</screen>
</example>
<example>
<title>Скрипт маршрутизации</title>
<para>
В следующем примере при запросе изображений выводится графический файл,
а при запросе HTML-файлов возвращается строка "Добро пожаловать в PHP".
</para>
<programlisting role="php">
<![CDATA[
<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
return false; // Сервер возвращает файлы непосредственно
} else {
echo "<p>Добро пожаловать в PHP!</p>";
}
]]>
</programlisting>
<programlisting role="shell">
<![CDATA[
$ php -S localhost:8000 router.php
]]>
</programlisting>
<warning>
<para>
Встроенный веб-сервер не должен использоваться в общедоступной сети.
</para>
</warning>
</example>
<example>
<title>Проверка использования веб-сервера CLI</title>
<para>
Для совместного использования скрипта маршрутизации при разработке с
веб-сервером CLI и в дальнейшем с рабочим (production) веб-сервером:
</para>
<programlisting role="php">
<![CDATA[
<?php
// router.php
if (php_sapi_name() == 'cli-server') {
/* Маршрутизация статических ресурсов и возврат значения false */
}
/* Продолжение стандартных операций с файлом index.php */
]]>
</programlisting>
<programlisting role="shell">
<![CDATA[
$ php -S localhost:8000 router.php
]]>
</programlisting>
</example>
<example>
<title>Обработка неподдерживаемых типов файлов</title>
<para>
Для обслуживания статического ресурса, MIME-тип которого не обрабатывается
веб-сервером CLI, используйте это:
</para>
<programlisting role="php">
<![CDATA[
<?php
// router.php
$path = pathinfo($_SERVER["SCRIPT_FILENAME"]);
if ($path["extension"] == "el") {
header("Content-Type: text/x-script.elisp");
readfile($_SERVER["SCRIPT_FILENAME"]);
} else {
return FALSE;
}
]]>
</programlisting>
<programlisting role="shell">
<![CDATA[
$ php -S localhost:8000 router.php
]]>
</programlisting>
</example>
<example>
<title>Доступ к веб-серверу CLI с удалённых машин</title>
<para>
Следующая команда откроет доступ к веб-серверу на порту 8000 для всех сетевых интерфейсов:
</para>
<programlisting role="shell">
<![CDATA[
$ php -S 0.0.0.0:8000
]]>
</programlisting>
</example>
</section>
<!--}}}-->
<section xml:id="features.commandline.ini">
<title>Опции конфигурации</title>
<para>
<table>
<title>Опции конфигурации CLI SAPI</title>
<tgroup cols="4">
<thead>
<row>
<entry>&Name;</entry>
<entry>&Default;</entry>
<entry>&Changeable;</entry>
<entry>&Changelog;</entry>
</row>
</thead>
<tbody xml:id="features.commandline.ini.list">
<row>
<entry><link linkend="ini.cli-server.color">cli_server.color</link></entry>
<entry>"0"</entry>
<entry><constant>INI_ALL</constant></entry>
<entry></entry>
</row>
</tbody>
</tgroup>
</table>
</para>
&ini.descriptions.title;
<para>
<variablelist>
<varlistentry xml:id="ini.cli-server.color">
<term>
<parameter>cli_server.color</parameter>
<type>bool</type>
</term>
<listitem>
<para>
Включает поддержку цветовых кодов ANSI в выводе терминала
встроенного веб-сервера.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=marker fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->