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

Опубликовано: 2022-08-11

Иллюстрация с логотипом PHP

Нужно быстро запустить веб-сервер для тестирования PHP-приложения? Интерпретатор PHP имеет один встроенный! Вы можете использовать это для быстрой проверки своей работы, не запуская Apache, NGINX или решение для контейнеризации.

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

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

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

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

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

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

 $ php -S локальный хост: 8080
[Пт, 10 июня, 16:00:00] Сервер разработки PHP 8.1.5 (http://localhost:8080) запущен

Аргумент, переданный команде, указывает адрес прослушивания сервера. В приведенном выше примере мы использовали порт 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 будет искать файлы index.php и index.html в корневом каталоге активного документа, если во входящем запросе отсутствует компонент URI. Если ни один из этих файлов не существует, сервер будет продолжать двигаться вверх по дереву каталогов в поисках индекса в одном из родительских корневых файлов вашего документа. Это означает, что вы можете непреднамеренно обслуживать контент, который находится за пределами указанного вами каталога. Статус 404 Not Found будет выдан, когда вершина дерева будет достигнута, но индексный файл не будет найден.

Запросы, включающие URI (например, /file ), должны точно соответствовать статическому файлу в корне документа. В противном случае будет возвращена ошибка 404. PHP автоматически устанавливает заголовок ответа Content-Type в тип MIME обслуживаемого файла для большинства популярных расширений файлов.

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

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

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

 $ php -S локальный хост: 8080 router.php

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

 если ( $_SERVER [ "REQUEST_URI" ] === "/приборная панель" ) {
    require_once ( "dashboard.php" ) ;
}
иначе если ( $_SERVER [ "REQUEST_URI" ] === "/профиль" ) {
    require_once ( "profile.php" ) ;
}
еще {
    require_once ( "404.php" ) ;
}

Вывод, созданный вашим скриптом маршрутизатора, станет ответом, отправленным обратно клиенту. Исключение составляет случай, когда скрипт возвращает false : в этом случае PHP возвращается к возврату статического файла, соответствующего исходному URI запроса.

 если ( str_starts_with ( $_SERVER [ "REQUEST_URI" ] , "/api" ) ) {
    // Маршрут к правильной конечной точке API
    // ...
}
еще {
    // Обслуживаем другие маршруты статически
    вернуть ложь ;
}

Обнаружение встроенного сервера из вашего PHP-кода

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

 если ( php_sapi_name ( ) === "кли-сервер" ) {
    enable_development_mode ( ) ;
}

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

По умолчанию сервер работает в однопроцессном синхронном режиме. Запросы обрабатываются индивидуально и блокируют выполнение друг друга до тех пор, пока они не будут выполнены. Это одна из причин, по которой сервер не подходит для использования в продакшене.

В PHP 7.4 добавлена ​​поддержка одновременной обработки нескольких запросов. Он зависит от доступности fork() и не работает в Windows. Когда этот режим включен, сервер будет создавать нового работника для обслуживания каждого входящего запроса. Вы можете активировать его, задав для переменной среды PHP_CLI_SERVER_WORKERS количество рабочих процессов:

 $ PHP_CLI_SERVER_WORKERS=8 php -S локальный хост:8080

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

Резюме

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

Хотя сервер теперь поддерживает необязательный режим разветвления, не рекомендуется использовать его в рабочей среде. Он предназначен для помощи в разработке и не имеет функций настройки и безопасности, которые вам понадобятся для общедоступных развертываний. В чем он превосходен, так это в качестве легкой и интегрированной альтернативы традиционным платформам разработки, таким как контейнеры WAMP, XAMPP и Docker.