Jak szybko testować strony internetowe za pomocą wbudowanego serwera WWW PHP?

Opublikowany: 2022-08-11

Ilustracja przedstawiająca logo PHP

Potrzebujesz 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.