Встроенный веб-сервер
Внимание
Веб-сервер предназначен для помощи в разработке приложений. Он также может
быть полезным в тестовых целях или для демонстрации приложения, запускаемого
в полностью контролируемом окружении. Он не выполняет функции полноценного
веб-сервера и не должен использоваться в общедоступных сетях.
Модуль CLI SAPI содержит встроенный веб-сервер.
Веб-сервер выполняет только один однопоточный процесс, поэтому приложения PHP
будут останавливаться, если запрос заблокирован.
URI-запросы обслуживаются из текущей директории, в которой был запущен PHP,
если не используется опция -t для явного указания корневого документа.
Если URI запроса не указывает на определённый файл, то будет возвращён
index.php или index.html в указанной директории. Если ни один из файлов не существует,
то поиск этих файлов будет продолжен в родительской директории и так далее до тех пор,
пока они не будут найдены или был достигнут корень документа. Если найден
index.php или index.html, он возвращается, а в $_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 не поддерживает эту функцию.
Внимание
Эта экспериментальная функция не
предназначена для производственного окружения. Обычно встроенный веб-сервер
не предназначен для производственного окружения.
Пример #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 порту для всех сетевых интерфейсов: