So testen Sie Websites schnell mit dem integrierten Webserver von PHP

Veröffentlicht: 2022-08-11

Abbildung zeigt das PHP-Logo

Müssen Sie schnell einen Webserver starten, um eine PHP-Anwendung zu testen? Der PHP-Interpreter hat einen eingebaut! Sie können dies verwenden, um Ihre Arbeit schnell zu überprüfen, ohne Apache, NGINX oder eine Containerisierungslösung auszuführen.

Der integrierte Server von PHP erhält relativ wenig Aufmerksamkeit, ist aber für Entwicklungszwecke ziemlich leistungsfähig. In diesem Handbuch zeigen wir, wie Sie es als Alternative zu anderen Mikroservern wie Pythons SimpleHTTPServer oder dem http-Server-npm-Paket verwenden können, die beide keine PHP-Skripte ausführen können.

Verwenden des integrierten Servers

Der eingebaute Server ist ein praktischer Mechanismus, der Ihnen hilft, PHP-Sites in Umgebungen zu testen, die keinen vollwertigen HTTP-Server haben. Es ist in PHP 5.4 und allen späteren Versionen verfügbar. Sie können es direkt aus Ihrem Arbeitsverzeichnis ausführen, ohne zuerst einen virtuellen Host einrichten zu müssen.

Seien Sie vor der Verwendung des Servers gewarnt, dass er nur für Entwicklungszwecke konzipiert ist. Die PHP-Dokumentation warnt ausdrücklich davor, diesen Server vor Produktionsanwendungen einzusetzen. Es ist nicht sicher genug, um in öffentlich zugänglichen Netzwerken offengelegt zu werden.

Starten des Servers

Der Server wird gestartet, indem das Flag -S an die ausführbare php -Datei übergeben wird:

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

Das dem Befehl übergebene Argument gibt die Empfangsadresse des Servers an. Im obigen Beispiel haben wir Port 8080 auf localhost verwendet. Jetzt können Sie http://localhost:8080 in Ihrem Webbrowser aufrufen, um auf den Inhalt in Ihrem Arbeitsverzeichnis zuzugreifen. Alle PHP-Skripte werden automatisch ausgeführt, wenn Sie sie anfordern.

Sie können einen Pfad bereitstellen, der sich außerhalb Ihres Arbeitsverzeichnisses befindet, indem Sie beim Starten des Servers das Flag -t setzen:

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

Das Dokumenten-Stammverzeichnis ist jetzt /public_docs in Ihrem Home-Ordner.

Lassen Sie Ihr Terminalfenster geöffnet, während Sie den Webserver verwenden. Drücken Sie Strg+C, um den Prozess abzubrechen, sobald Sie mit dem Testen Ihrer Website fertig sind. PHP protokolliert jede eingehende Anfrage in Ihrem Terminalfenster, einschließlich der URI- und HTTP-Methode. Alle nicht erfassten PHP-Fehler werden auch in den Protokollen angezeigt.

Fernzugriff aktivieren

Das Abhören auf localhost lässt keine eingehenden Verbindungen von anderen Geräten in Ihrem Netzwerk zu. Sie können den Fernzugriff zulassen, indem Sie stattdessen an 0.0.0.0 binden:

 $php-S 0.0.0.0:8080

Denken Sie daran, dass der Server nicht für den Produktionseinsatz gehärtet ist und nicht öffentlich zugänglich gemacht werden sollte. Erlauben Sie den Fernzugriff nur, wenn es unbedingt erforderlich ist, z. B. beim Testen einer bestimmten Funktion auf einem Mobilgerät. Stellen Sie sicher, dass der von Ihnen verwendete Port nicht für das Internet geöffnet ist.

Fallback-Matching anfordern

PHP sucht nach index.php und index.html -Dateien im Stammverzeichnis des aktiven Dokuments, wenn der eingehenden Anfrage eine URI-Komponente fehlt. Wenn keine dieser Dateien vorhanden ist, bewegt sich der Server im Verzeichnisbaum weiter nach oben und sucht nach einem Index in einem der übergeordneten Dokumente Ihres Dokumentstammverzeichnisses. Dies bedeutet, dass Sie unbeabsichtigt Inhalte bereitstellen können, die sich außerhalb des von Ihnen angegebenen Verzeichnisses befinden. Der Status 404 Not Found wird ausgegeben, wenn die Spitze des Baums erreicht wird, ohne dass eine Indexdatei gefunden wird.

Anforderungen, die einen URI enthalten (z. B. /file ), müssen genau mit einer statischen Datei im Dokumentstamm übereinstimmen. Andernfalls wird ein 404 zurückgegeben. PHP setzt den Content-Type Antwortheader für die gängigsten Dateierweiterungen automatisch auf den MIME-Typ der bereitgestellten Datei.

Verwenden eines Router-Skripts

Sie können den Webserver optional so konfigurieren, dass er bei jeder Anfrage ein Skript aufruft. Auf diese Weise können Sie den Front-Controller Ihrer Anwendung verwenden, um erweitertes dynamisches Routing durchzuführen.

Die Router-Funktionalität wird aktiviert, indem Sie beim Starten des Servers einen PHP-Dateinamen in der Befehlszeile angeben:

 $ php -S localhost:8080router.php

PHP verwendet jetzt router.php , um jede eingehende Anfrage zu verarbeiten. Sie können Benutzer an die entsprechende Stelle in Ihrer Anwendung weiterleiten, indem Sie den Anforderungs-URI überprüfen:

 if ( $_SERVER [ "REQUEST_URI" ] === "/dashboard" ) {
    require_once ( "dashboard.php" ) ;
}
sonst wenn ( $_SERVER [ "REQUEST_URI" ] === "/profile" ) {
    require_once ( "profile.php" ) ;
}
sonst {
    require_once ( "404.php" ) ;
}

Die von Ihrem Router-Skript erzeugte Ausgabe wird zur Antwort, die an den Client zurückgesendet wird. Eine Ausnahme ist, wenn das Skript false zurückgibt: In diesem Fall greift PHP darauf zurück, die statische Datei zurückzugeben, die mit dem ursprünglichen Anforderungs-URI übereinstimmt.

 if ( str_starts_with ( $_SERVER [ "REQUEST_URI" ] , "/api" ) ) {
    // Route zum richtigen API-Endpunkt
    // ...
}
sonst {
    // Andere Routen statisch bedienen
    gebe falsch zurück ;
}

Erkennen des integrierten Servers anhand Ihres PHP-Codes

Ihr PHP-Code kann erkennen, ob er vom integrierten Webserver aufgerufen wird, indem er den Namen der aktiven Schnittstelle untersucht. Die Funktion php_sapi_name() liefert diesen Wert. Es wird auf cli-server gesetzt, wenn das Skript von der integrierten Serverkomponente aufgerufen wurde.

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

Gleichzeitige Bearbeitung mehrerer Anfragen

Der Server wird standardmäßig in einem synchronen Einzelprozessmodus ausgeführt. Anforderungen werden einzeln behandelt und blockieren sich gegenseitig für die Ausführung, bis sie abgeschlossen sind. Dies ist einer der Gründe, warum der Server für den Produktiveinsatz ungeeignet ist.

PHP 7.4 hat Unterstützung für die gleichzeitige Bearbeitung mehrerer Anfragen hinzugefügt. Es hängt von der Verfügbarkeit von fork() ab und funktioniert nicht unter Windows. Der Server forkt einen neuen Worker, um jede eingehende Anfrage zu bedienen, wenn dieser Modus aktiviert ist. Sie können es aktivieren, indem Sie die Umgebungsvariable PHP_CLI_SERVER_WORKERS auf die gewünschte Anzahl von Workern setzen:

 $ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080

Diese Funktionalität ist in PHP 8.1 noch als experimentell gekennzeichnet.

Zusammenfassung

PHP verfügt über einen integrierten Webserver, mit dem Sie Ihre Anwendungen bequem testen und lokale Dateisysteminhalte schnell in Ihrem lokalen Netzwerk verfügbar machen können. Es unterstützt die Ausführung von PHP-Skripten, Catch-All-Routing und statische Dateien mit den gängigsten MIME-Typen.

Obwohl der Server jetzt einen optionalen Forking-Modus unterstützt, ist es nicht ratsam, ihn in der Produktion zu verwenden. Es ist als Entwicklungshilfe gedacht und es fehlen die Anpassungs- und Sicherheitsfunktionen, die Sie für Ihre öffentlichen Bereitstellungen benötigen. Es zeichnet sich durch eine leichte und integrierte Alternative zu herkömmlichen Entwicklungsplattformen wie WAMP-, XAMPP- und Docker-Containern aus.