Поиск по сайту:

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


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

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

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

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

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

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

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

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

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

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

Функциональность маршрутизатора включается путем предоставления имени файла 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-скриптов, полную маршрутизацию и статические файлы с наиболее распространенными типами MIME.

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




Все права защищены. © Linux-Console.net • 2019-2024