Jak szybko testować strony internetowe za pomocą wbudowanego serwera WWW PHP?
Opublikowany: 2022-08-11Potrzebujesz szybko uruchomić serwer WWW, aby przetestować aplikację PHP? Interpreter PHP ma jeden wbudowany! Możesz użyć tego, aby szybko sprawdzić swoją pracę bez uruchamiania Apache, NGINX lub rozwiązania do konteneryzacji.
Zintegrowany serwer PHP przyciąga stosunkowo mało uwagi, ale jest dość wydajny do celów programistycznych. W tym przewodniku pokażemy, jak można go używać jako alternatywy dla innych mikroserwerów, takich jak SimpleHTTPServer Pythona lub pakiet npm serwera http, z których żaden nie może wykonywać skryptów PHP.
Korzystanie z wbudowanego serwera
Wbudowany serwer to wygodny mechanizm, który pomaga testować witryny PHP w środowiskach, w których brakuje pełnoprawnego serwera HTTP. Jest dostępny w PHP 5.4 i wszystkich późniejszych wersjach. Możesz go uruchomić bezpośrednio z katalogu roboczego bez konieczności wcześniejszego konfigurowania wirtualnego hosta.
Przed użyciem serwera należy pamiętać, że jest on przeznaczony wyłącznie do użytku programistycznego. Dokumentacja PHP wyraźnie ostrzega przed wdrażaniem tego serwera przed aplikacjami produkcyjnymi. Nie jest wystarczająco bezpieczny, aby można go było ujawnić w publicznie dostępnych sieciach.
Uruchamianie serwera
Serwer jest uruchamiany poprzez przekazanie flagi -S
do pliku wykonywalnego php
:
$ php -S localhost:8080 [Fri Jun 10 16:00:00 2022] PHP 8.1.5 Development Server (http://localhost:8080) uruchomiony
Argument podany poleceniu określa adres nasłuchiwania serwera. W powyższym przykładzie użyliśmy portu 8080
na localhost
. Teraz możesz odwiedzić http://localhost:8080
w przeglądarce internetowej, aby uzyskać dostęp do zawartości w katalogu roboczym. Wszelkie skrypty PHP będą wykonywane automatycznie, gdy o nie poprosisz.
Możesz podać ścieżkę, która znajduje się poza twoim katalogiem roboczym, ustawiając flagę -t
podczas uruchamiania serwera:
$ php -S localhost:8080 -t /home/$USER/public_docs
Katalogiem głównym dokumentu będzie teraz /public_docs
w twoim folderze domowym.
Pozostaw otwarte okno terminala podczas korzystania z serwera WWW. Naciśnij Ctrl+C, aby zakończyć proces po zakończeniu testowania witryny. PHP będzie logować każde przychodzące żądanie w oknie terminala, w tym metodę URI i HTTP. W dziennikach pojawią się również wszelkie nieprzechwycone błędy PHP.
Włączanie zdalnego dostępu
Nasłuchiwanie na localhost
nie pozwoli na połączenia przychodzące z innych urządzeń w Twojej sieci. Zamiast tego możesz zezwolić na zdalny dostęp, wiążąc się z 0.0.0.0
:
$php -S 0.0.0.0:8080
Pamiętaj, że serwer nie jest przystosowany do użytku produkcyjnego i nie powinien być publicznie ujawniany. Zezwalaj na zdalny dostęp tylko wtedy, gdy jest to absolutnie konieczne, na przykład podczas testowania określonej funkcji na urządzeniu mobilnym. Upewnij się, że używany port nie jest otwarty na internet.
Poproś o dopasowanie zastępcze
PHP będzie szukać plików index.php
i index.html
w aktywnym katalogu głównym dokumentu, gdy przychodzące żądanie nie zawiera składnika URI. Jeśli żaden z tych plików nie istnieje, serwer będzie przesuwał się w górę drzewa katalogów, szukając indeksu w jednym z nadrzędnych katalogu głównego dokumentu. Oznacza to, że możesz niechcący zakończyć udostępnianie treści, które znajdują się poza określonym katalogiem. Status 404 Not Found zostanie wygenerowany po osiągnięciu wierzchołka drzewa bez odnalezienia pliku indeksu.
Żądania zawierające identyfikator URI (takie jak /file
) muszą być dokładnie dopasowane przez plik statyczny w katalogu głównym dokumentu. W przeciwnym razie 404 zostanie zwrócony. PHP automatycznie ustawia nagłówek odpowiedzi Content-Type
na typ MIME udostępnianego pliku dla najpopularniejszych rozszerzeń plików.
Korzystanie ze skryptu routera
Opcjonalnie można skonfigurować serwer sieciowy, aby wywoływał skrypt przy każdym żądaniu. Dzięki temu możesz używać kontrolera frontowego aplikacji do wykonywania zaawansowanego routingu dynamicznego.
Funkcjonalność routera jest włączana poprzez podanie nazwy pliku PHP w wierszu poleceń podczas uruchamiania serwera:
$ php -S localhost:8080 router.php
PHP będzie teraz używać router.php
do obsługi każdego przychodzącego żądania. Możesz kierować użytkowników do odpowiedniego punktu w aplikacji, sprawdzając identyfikator URI żądania:
if ( $_SERVER [ "REQUEST_URI" ] === "/panel" ) { require_once ( "dashboard.php" ) ; } else if ( $_SERVER [ "REQUEST_URI" ] === "/profile" ) { require_once ( "profile.php" ) ; } jeszcze { require_once ( "404.php" ) ; }
Dane wyjściowe wygenerowane przez skrypt routera staną się odpowiedzią wysłaną z powrotem do klienta. Wyjątkiem jest sytuacja, gdy skrypt zwróci false
: w tym przypadku PHP powróci do zwrócenia pliku statycznego, który pasuje do oryginalnego identyfikatora URI żądania.
if ( str_starts_with ( $_SERVER [ "REQUEST_URI" ] , "/api" ) ) { // Trasa do właściwego punktu końcowego API //... } jeszcze { // Obsługuj inne trasy statycznie zwróć fałsz ; }
Wykrywanie wbudowanego serwera na podstawie kodu PHP
Twój kod PHP może wykryć, czy jest wywoływany przez wbudowany serwer WWW, sprawdzając nazwę aktywnego interfejsu. Funkcja php_sapi_name()
udostępnia tę wartość. Zostanie ustawiony na cli-server
gdy skrypt zostanie wywołany przez zintegrowany komponent serwera.
if ( php_sapi_name ( ) === "cli-server" ) { enable_development_mode ( ) ; }
Obsługa wielu żądań jednocześnie
Serwer domyślnie działa w trybie synchronicznym jednego procesu. Żądania są obsługiwane indywidualnie i blokują się wzajemnie przed wykonaniem, dopóki nie zostaną zakończone. Jest to jeden z powodów, dla których serwer nie nadaje się do użytku produkcyjnego.
PHP 7.4 dodało obsługę jednoczesnej obsługi wielu żądań. Opiera się na dostępności fork()
i nie działa w systemie Windows. Po włączeniu tego trybu serwer rozwidla nowego pracownika do obsługi każdego przychodzącego żądania. Możesz go aktywować, ustawiając zmienną środowiskową PHP_CLI_SERVER_WORKERS
na żądaną liczbę pracowników:
$ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080
Ta funkcjonalność jest nadal oznaczona jako eksperymentalna w PHP 8.1.
Streszczenie
PHP ma wbudowany serwer WWW, który jest wygodnym sposobem testowania aplikacji i szybkiego ujawniania zawartości lokalnego systemu plików w sieci lokalnej. Obsługuje wykonywanie skryptów PHP, routing typu catch-all i pliki statyczne z większością popularnych typów MIME.
Chociaż serwer obsługuje teraz opcjonalny tryb forkingu, nie zaleca się używania go w środowisku produkcyjnym. Jest przeznaczony jako pomoc programistyczna i nie ma funkcji dostosowywania i zabezpieczeń, które są potrzebne do wdrożeń publicznych. Wyróżnia się jako lekka i zintegrowana alternatywa dla konwencjonalnych platform programistycznych, takich jak kontenery WAMP, XAMPP i Docker.