<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.commandline.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'features.commandline.webserver.php',
    1 => 'Встроенный веб-сервер',
    2 => 'Встроенный веб-сервер',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'Работа с PHP из командной строки',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.interactive.php',
    1 => 'Интерактивная консоль',
  ),
  'next' => 
  array (
    0 => 'features.commandline.ini.php',
    1 => 'Опции конфигурации',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'features/commandline.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.commandline.webserver" class="section">
  <h2 class="title">Встроенный веб-сервер</h2>

  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="para">
    Веб-сервер предназначен для помощи в разработке приложений. Он также может
    быть полезным в тестовых целях или для демонстрации приложения, запускаемого
    в полностью контролируемом окружении. Он не выполняет функции полноценного
    веб-сервера и не должен использоваться в общедоступных сетях.
   </p>
  </div>

  <p class="para">
   Модуль <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> содержит встроенный веб-сервер.
  </p>

  <p class="para">
   Веб-сервер выполняет только один однопоточный процесс, поэтому приложения PHP
   остановятся при блокировке запроса.
  </p>

  <p class="para">
   URI-запросы обслуживаются из текущей директории, в которой запустили PHP,
   если не указали опцию -t для переназначения корневого документа.
   При запросе URI, который не указывает на конкретный файл, возвращается
   файл index.php или index.html в заданной директории. При недоступности файлов
   поиск файлов продолжается в родительской директории, и так далее,
   пока веб-сервер не найдёт файл или не достигнет корня документа. При обнаружении
   файла index.html веб-сервер возвращает содержимое файла, а при обнаружении файла index.php — возвращается результат обработки.
   При этом в элемент $_SERVER[&#039;PATH_INFO&#039;]
   записывается последняя часть URL-адреса, иначе возвращается 404-й код ответа.
  </p>

  <p class="para">
   Если PHP-файл указывается в командной строке, когда запускается веб-сервер,
   то он рассматривается как скрипт &quot;маршрутизации&quot; (router). Скрипт выполняется
   в самом начале каждого HTTP-запроса. Если этот скрипт возвращает
   <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, то запрашиваемый ресурс возвращается как есть.
   В противном случае браузеру будет возвращён вывод этого скрипта.
  </p>

  <p class="para">
   Стандартные MIME-типы возвращаются для файлов со следующими расширениями:
   <span class="simplelist"><code class="literal">.3gp</code>, <code class="literal">.apk</code>, <code class="literal">.avi</code>, <code class="literal">.bmp</code>, <code class="literal">.css</code>, <code class="literal">.csv</code>, <code class="literal">.doc</code>, <code class="literal">.docx</code>, <code class="literal">.flac</code>, <code class="literal">.gif</code>, <code class="literal">.gz</code>, <code class="literal">.gzip</code>, <code class="literal">.htm</code>, <code class="literal">.html</code>, <code class="literal">.ics</code>, <code class="literal">.jpe</code>, <code class="literal">.jpeg</code>, <code class="literal">.jpg</code>, <code class="literal">.js</code>, <code class="literal">.kml</code>, <code class="literal">.kmz</code>, <code class="literal">.m4a</code>, <code class="literal">.mov</code>, <code class="literal">.mp3</code>, <code class="literal">.mp4</code>, <code class="literal">.mpeg</code>, <code class="literal">.mpg</code>, <code class="literal">.odp</code>, <code class="literal">.ods</code>, <code class="literal">.odt</code>, <code class="literal">.oga</code>, <code class="literal">.ogg</code>, <code class="literal">.ogv</code>, <code class="literal">.pdf</code>, <code class="literal">.png</code>, <code class="literal">.pps</code>, <code class="literal">.pptx</code>, <code class="literal">.qt</code>, <code class="literal">.svg</code>, <code class="literal">.swf</code>, <code class="literal">.tar</code>, <code class="literal">.text</code>, <code class="literal">.tif</code>, <code class="literal">.txt</code>, <code class="literal">.wav</code>, <code class="literal">.webm</code>, <code class="literal">.wmv</code>, <code class="literal">.xls</code>, <code class="literal">.xlsx</code>, <code class="literal">.xml</code>, <code class="literal">.xsl</code>, <code class="literal">.xsd</code>, <code class="literal">.zip</code></span>
   .
  </p>

  <p class="simpara">
   Начиная с PHP 7.4.0 встроенный веб-сервер получил поддержку
   многопроцессного режима работы для тестирования кода, который требует нескольких
   одновременных запросов к встроенному веб-серверу.
   Перед запуском сервера для переменной среды <var class="envar">PHP_CLI_SERVER_WORKERS</var>
   устанавливают количество рабочих процессов, которое требуется для тестирования.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">ОС Windows не поддерживает многопроцессный режим.</span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Информацию о параметрах, которые поддерживает PHP в режиме командной строки,
    возвращают команды <strong class="command">php --help</strong> или <strong class="command">man php</strong>.
    PHP проигнорирует параметры командной строки, которые не сочетаются с параметром запуска веб-сервера.
   </span>
  </p></blockquote>
  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="para">
    Встроенный веб-сервер — <em>экспериментальная</em> функция,
    которая <em>не</em> рассчитана на работу в производственном окружении;
    сервер запускают <em>только</em> в целях разработки.
   </p>
  </div>

  <div class="example" id="example-1">
   <p><strong>Пример #1 Запуск веб-сервера</strong></p>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ cd ~/public_html
$ php -S localhost:8000</pre>
</div>
   </div>

   <div class="example-contents"><p>
    В консоли выведется:
   </p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
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
</pre></div>
   </div>
   <div class="example-contents"><p>
    После URI-запросов http://localhost:8000/ и http://localhost:8000/myscript.html
    в консоли выведется примерно следующее:
   </p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
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
</pre></div>
   </div>
   <div class="example-contents"><p>
    Обратите внимание, что до PHP 7.4.0 статические ресурсы с символическими ссылками не были доступны в Windows, если только скрипт маршрутизатора не обработал бы их.
   </p></div>
  </div>

  <div class="example" id="example-2">
   <p><strong>Пример #2 Запуск с указанием корневой директории</strong></p>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ cd ~/public_html
$ php -S localhost:8000 -t foo/</pre>
</div>
   </div>

   <div class="example-contents"><p>
    В консоли выведется:
   </p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
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
</pre></div>
   </div>
  </div>

  <div class="example" id="example-3">
   <p><strong>Пример #3 Скрипт маршрутизации</strong></p>
   <div class="example-contents"><p>
    В следующем примере при запросе изображений выводится графический файл,
    а при запросе HTML-файлов возвращается строка &quot;Добро пожаловать в PHP&quot;.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// router.php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/\.(?:png|jpg|jpeg|gif)$/'</span><span style="color: #007700">, </span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">"REQUEST_URI"</span><span style="color: #007700">])) {<br />    return </span><span style="color: #0000BB">false</span><span style="color: #007700">;    </span><span style="color: #FF8000">// Сервер возвращает файлы непосредственно<br /></span><span style="color: #007700">} else {<br />    echo </span><span style="color: #DD0000">"&lt;p&gt;Добро пожаловать в PHP!&lt;/p&gt;"</span><span style="color: #007700">;<br />}</span></span></code></div>
   </div>

   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -S localhost:8000 router.php</pre>
</div>
   </div>

   <div class="warning"><strong class="warning">Внимание</strong>
    <p class="para">
     Встроенный веб-сервер не должен использоваться в общедоступной сети.
    </p>
   </div>
  </div>

  <div class="example" id="example-4">
   <p><strong>Пример #4 Проверка использования веб-сервера CLI</strong></p>
   <div class="example-contents"><p>
    Для совместного использования скрипта маршрутизации при разработке с
    веб-сервером CLI и в дальнейшем с рабочим (production) веб-сервером:
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// router.php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">php_sapi_name</span><span style="color: #007700">() == </span><span style="color: #DD0000">'cli-server'</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">/* Маршрутизация статических ресурсов и возврат значения false */<br /></span><span style="color: #007700">}<br /></span><span style="color: #FF8000">/* Продолжение стандартных операций с файлом index.php */</span></span></code></div>
   </div>

   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -S localhost:8000 router.php</pre>
</div>
   </div>

  </div>

  <div class="example" id="example-5">
   <p><strong>Пример #5 Обработка неподдерживаемых типов файлов</strong></p>
   <div class="example-contents"><p>
    Для обслуживания статического ресурса, MIME-тип которого не обрабатывается
    веб-сервером CLI, используйте это:
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// router.php<br /></span><span style="color: #0000BB">$path </span><span style="color: #007700">= </span><span style="color: #0000BB">pathinfo</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">"SCRIPT_FILENAME"</span><span style="color: #007700">]);<br />if (</span><span style="color: #0000BB">$path</span><span style="color: #007700">[</span><span style="color: #DD0000">"extension"</span><span style="color: #007700">] == </span><span style="color: #DD0000">"el"</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Content-Type: text/x-script.elisp"</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">"SCRIPT_FILENAME"</span><span style="color: #007700">]);<br />} else {<br />    return </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;<br />}</span></span></code></div>
   </div>

   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -S localhost:8000 router.php</pre>
</div>
   </div>

  </div>

  <div class="example" id="example-6">
   <p><strong>Пример #6 Доступ к веб-серверу CLI с удалённых машин</strong></p>
   <div class="example-contents"><p>
    Следующая команда откроет доступ к веб-серверу на порту 8000 для всех сетевых интерфейсов:
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -S 0.0.0.0:8000</pre>
</div>
   </div>

  </div>

 </div><?php manual_footer($setup); ?>