Встроенный веб-сервер
Внимание
Веб-сервер предназначен для помощи в разработке приложений. Он также может
быть полезным в тестовых целях или для демонстрации приложения, запускаемого
в полностью контролируемом окружении. Он не выполняет функции полноценного
веб-сервера и не должен использоваться в общедоступных сетях.
Модуль 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 проигнорирует параметры командной строки, которые не сочетаются с параметром запуска веб-сервера.
Внимание
Встроенный веб-сервер — экспериментальная функция,
которая не рассчитана на работу в производственном окружении;
сервер запускают только в целях разработки.
Пример #1 Запуск веб-сервера
$ cd ~/public_html
$ php -S localhost:8000
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
После URI-запросов http://localhost:8000/ и http://localhost:8000/myscript.html
в консоли выведется примерно следующее:
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
Обратите внимание, что до PHP 7.4.0 статические ресурсы с символическими ссылками не были доступны в Windows, если только скрипт маршрутизатора не обработал бы их.
Пример #2 Запуск с указанием корневой директории
$ cd ~/public_html
$ php -S localhost:8000 -t foo/
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
Пример #3 Скрипт маршрутизации
В следующем примере при запросе изображений выводится графический файл,
а при запросе HTML-файлов возвращается строка "Добро пожаловать в PHP".
<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
return false; // Сервер возвращает файлы непосредственно
} else {
echo "<p>Добро пожаловать в PHP!</p>";
}
$ php -S localhost:8000 router.php
Внимание
Встроенный веб-сервер не должен использоваться в общедоступной сети.
Пример #4 Проверка использования веб-сервера CLI
Для совместного использования скрипта маршрутизации при разработке с
веб-сервером CLI и в дальнейшем с рабочим (production) веб-сервером:
<?php
// router.php
if (php_sapi_name() == 'cli-server') {
/* Маршрутизация статических ресурсов и возврат значения false */
}
/* Продолжение стандартных операций с файлом index.php */
$ php -S localhost:8000 router.php
Пример #5 Обработка неподдерживаемых типов файлов
Для обслуживания статического ресурса, MIME-тип которого не обрабатывается
веб-сервером CLI, используйте это:
<?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;
}
$ php -S localhost:8000 router.php
Пример #6 Доступ к веб-серверу CLI с удалённых машин
Следующая команда откроет доступ к веб-серверу на порту 8000 для всех сетевых интерфейсов: