📦 Как быстро протестировать веб-сайты с помощью встроенного веб-сервера PHP

by itisgood

Нужно быстро запустить веб-сервер для тестирования PHP-приложения?

В интерпретаторе PHP есть встроенный!

Вы можете использовать его для быстрой проверки своей работы без запуска Apache, NGINX или решения контейнеризации.

Встроенный сервер PHP получает относительно мало внимания, но является достаточно мощным для целей разработки.

В этом руководстве мы покажем, как вы можете использовать его в качестве альтернативы другим микросерверам, таким как Python’s SimpleHTTPServer или пакет http-server npm, ни один из которых не может выполнять PHP-скрипты.

Использование встроенного сервера

Встроенный сервер – это удобный механизм, помогающий тестировать PHP сайты в окружении, где нет полноценного HTTP сервера.

Он доступен в PHP 5.4 и всех последующих версиях.

Вы можете запускать его прямо из рабочей директории без необходимости предварительно устанавливать виртуальный хост.

Прежде чем использовать сервер, предупредите, что он предназначен только для разработки.

Документация PHP явно предостерегает от развертывания этого сервера c производственными приложениями.

Он недостаточно безопасен, чтобы использовать его в общедоступных сетях.

Запуск сервера

Сервер запускается путем передачи флага -S исполняемому файлу php:

$ php -S localhost:8080
[Fri Jun 10 16:00:00 2022] PHP 8.1.5 Development Server (http://localhost:8080) started

Аргумент, передаваемый команде, определяет адрес прослушивания сервера.

В приведенном примере мы использовали порт 8080 на localhost.

Теперь вы можете посетить сайт http://localhost:8080 в веб-браузере, чтобы получить доступ к содержимому вашего рабочего каталога.

Любые PHP-скрипты будут выполняться автоматически, когда вы их запросите.

Вы можете обслуживать путь, находящийся за пределами вашей рабочей директории, установив флаг -t при запуске сервера:

$ php -S localhost:8080 -t /home/$USER/public_docs

Теперь корнем документа будет /public_docs в вашей домашней папке.

Держите окно терминала открытым, пока вы используете веб-сервер.

Нажмите Ctrl+C, чтобы завершить процесс, когда закончите тестировать свой сайт.

PHP будет регистрировать каждый входящий запрос в окне терминала, включая URI и метод HTTP.

Любые не пойманные ошибки PHP также будут отображаться в логах.

Включение удаленного доступа

Прослушивание на localhost не сломает входящие соединения с других устройств в вашей сети.

Вы можете разрешить удаленный доступ, привязавшись к 0.0.0.0:

$ php -S 0.0.0.0:8080

Помните, что сервер не защищен для использования в производственных целях и не должен быть публично открыт.

Разрешайте удаленный доступ только в случае крайней необходимости, например, при тестировании определенной функции на мобильном устройстве.

Убедитесь, что используемый порт не открыт для доступа в Интернет.

Использование скрипта маршрутизатора

Вы можете дополнительно настроить веб-сервер на вызов скрипта при каждом запросе.

Это позволит вам использовать фронт-контроллер вашего приложения для выполнения расширенной динамической маршрутизации.

Функциональность маршрутизатора включается путем указания имени PHP-файла в командной строке при запуске сервера:

$ php -S localhost:8080 router.php
Теперь PHP будет использовать файл router.php для обработки каждого входящего запроса.
Вы можете направлять пользователей в нужную точку вашего приложения, изучая URI запроса:
if ($_SERVER["REQUEST_URI"] === "/dashboard") {
    require_once("dashboard.php");
}
else if ($_SERVER["REQUEST_URI"] === "/profile") {
    require_once("profile.php");
}
else {
    require_once("404.php");
}
Вывод, созданный вашим скриптом маршрутизатора, станет ответом, который будет отправлен обратно клиенту.
Исключением является случай, когда скрипт возвращает false: в этом случае PHP вернется к возврату статического файла, соответствующего исходному URI запроса.
if (str_starts_with($_SERVER["REQUEST_URI"], "/api")) {
    // Route to the correct API endpoint
    // ... 
}
else {
    // Serve other routes statically
    return false;
}

Определение встроенного сервера по вашему PHP-коду

Ваш PHP-код может определить, вызывается ли он встроенным веб-сервером, проверив имя активного интерфейса.
Функция php_sapi_name() предоставляет это значение.

Оно будет установлено в cli-server, если скрипт был вызван встроенным серверным компонентом.

if (php_sapi_name() === "cli-server") {
    enable_development_mode();
}

Одновременная обработка нескольких запросов

По умолчанию сервер работает в однопроцессном синхронном режиме.

Запросы обрабатываются по отдельности и блокируют выполнение друг друга до их завершения.

Это одна из причин, почему сервер не подходит для производственного использования.

В PHP 7.4 добавлена поддержка одновременной обработки нескольких запросов.

Она полагается на доступность fork() и не работает в Windows.

Когда этот режим включен, сервер будет вилкой запускать нового рабочего для обслуживания каждого входящего запроса.

Вы можете активировать его, установив переменную окружения PHP_CLI_SERVER_WORKERS на нужное вам количество воркеров:

$ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080

В PHP 8.1 эта функциональность все еще помечена как экспериментальная.

Заключение

PHP имеет встроенный веб-сервер, который является удобным способом тестирования ваших приложений и быстрого предоставления содержимого локальной файловой системы в локальной сети.

Он поддерживает выполнение PHP-скриптов, маршрутизацию по принципу catch-all и статические файлы с наиболее распространенными типами MIME.

см. также:

 

You may also like

Leave a Comment