PHP のビルトイン Web サーバーで Web サイトを迅速にテストする方法

公開: 2022-08-11

PHP ロゴを示す図

PHP アプリケーションをテストするために Web サーバーをすばやく起動する必要がありますか? PHP インタープリターには 1 つの組み込み機能があります。 これを使用すると、Apache、NGINX、またはコンテナー化ソリューションを実行しなくても、作業を迅速に検査できます。

PHP の統合サーバーはあまり注目されていませんが、開発目的では非常に強力です。 このガイドでは、Python の SimpleHTTPServer や http-server npm パッケージなど、どちらも PHP スクリプトを実行できない他のマイクロサーバーの代わりとして、それを使用する方法を示します。

ビルトインサーバーを使う

組み込みサーバーは、本格的な HTTP サーバーがない環境で PHP サイトをテストするのに役立つ便利なメカニズムです。 PHP 5.4 以降のすべてのバージョンで使用できます。 最初に仮想ホストを設定しなくても、作業ディレクトリから直接実行できます。

サーバーを使用する前に、開発目的でのみ設計されていることに注意してください。 PHP のドキュメントでは、このサーバーを本番アプリケーションの前にデプロイしないように明示的に警告しています。 一般にアクセス可能なネットワークに公開するには、十分に安全ではありません。

サーバーの起動

サーバーは、 -Sフラグをphp実行可能ファイルに渡すことによって開始されます。

 $ php -S ローカルホスト:8080
[2022 年 6 月 10 日(金) 16:00:00] PHP 8.1.5 開発サーバー (http://localhost:8080) を開始しました

コマンドに与えられた引数は、サーバーのリッスン アドレスを指定します。 上記の例では、 localhostでポート8080を使用しました。 これで、Web ブラウザーでhttp://localhost:8080にアクセスして、作業ディレクトリのコンテンツにアクセスできます。 PHP スクリプトは、要求すると自動的に実行されます。

サーバーの起動時に-tフラグを設定することで、作業ディレクトリの外にあるパスを提供できます。

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

ドキュメント ルートは、ホーム フォルダー内の/public_docsになります。

Web サーバーを使用している間は、ターミナル ウィンドウを開いたままにします。 サイトのテストが完了したら、Ctrl+C を押してプロセスを強制終了します。 PHP は、URI と HTTP メソッドを含め、受信した各リクエストを端末ウィンドウに記録します。 キャッチされなかった PHP エラーもログに表示されます。

リモート アクセスの有効化

localhostをリッスンしても、ネットワーク上の他のデバイスからの着信接続は許可されません。 代わりに0.0.0.0にバインドすることで、リモート アクセスを許可できます。

 $ php -S 0.0.0.0:8080

サーバーは本番用に強化されていないため、公開しないでください。 モバイル デバイスで特定の機能をテストする場合など、絶対に必要な場合にのみリモート アクセスを許可してください。 使用するポートがインターネットに対して開いていないことを確認してください。

フォールバック マッチングのリクエスト

着信要求に URI コンポーネントがない場合、PHP はアクティブなドキュメント ルートでindex.phpおよびindex.htmlファイルを探します。 これらのファイルがどちらも存在しない場合、サーバーはディレクトリ ツリーを上に移動し続け、ドキュメント ルートの親のいずれかでインデックスを探します。 これは、指定したディレクトリの外部にあるコンテンツを意図せず提供してしまう可能性があることを意味します。 インデックス ファイルが見つからずにツリーの最上部に到達すると、404 Not Found ステータスが発行されます。

URI ( /fileなど) を含むリクエストは、ドキュメント ルートの静的ファイルと正確に一致する必要があります。 それ以外の場合は、404 が返されます。 PHP は、最も一般的なファイル拡張子のContent-Type応答ヘッダーを、提供されたファイルの MIME タイプに自動的に設定します。

ルーター スクリプトの使用

オプションで、リクエストごとにスクリプトを呼び出すように Web サーバーを構成できます。 これにより、アプリケーションのフロント コントローラーを使用して、高度な動的ルーティングを実行できます。

サーバーの起動時にコマンドラインで PHP ファイル名を指定すると、ルーター機能が有効になります。

 $ php -S localhost:8080 router.php

PHP は今後、 router.phpを使用してすべての受信リクエストを処理します。 リクエスト URI を調べることで、ユーザーをアプリケーション内の適切なポイントにルーティングできます。

 if ( $_SERVER [ "REQUEST_URI" ] === "/ダッシュボード" ) {
    require_once ( "dashboard.php" ) ;
}
else if ( $_SERVER [ "REQUEST_URI" ] === "/profile" ) {
    require_once ( "profile.php" ) ;
}
そうでなければ{
    require_once ( "404.php" ) ;
}

ルーター スクリプトによって生成された出力は、クライアントに送り返される応答になります。 例外は、スクリプトがfalseを返す場合です。この場合、PHP は元のリクエスト URI に一致する静的ファイルを返すようにフォールバックします。

 if ( str_starts_with ( $_SERVER [ "REQUEST_URI" ] , "/api" ) ) {
    // 正しい API エンドポイントにルーティングします
    // ...
}
そうでなければ{
    // 他のルートを静的に提供する
    返します
}

PHP コードから組み込みサーバーを検出する

PHP コードは、アクティブなインターフェイス名を調べることで、組み込み Web サーバーによって呼び出されているかどうかを検出できます。 php_sapi_name()関数がこの値を提供します。 スクリプトが統合サーバー コンポーネントによって呼び出されたときに、 cli-serverに設定されます。

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

複数のリクエストを同時に処理する

デフォルトでは、サーバーは単一プロセスの同期モードで実行されます。 リクエストは個別に処理され、完了するまで互いの実行をブロックします。 これが、サーバーが本番環境での使用に適さない理由の 1 つです。

PHP 7.4 では、複数のリクエストを同時に処理するためのサポートが追加されました。 fork()の可用性に依存しており、Windows では機能しません。 このモードが有効になっている場合、サーバーは新しいワーカーをフォークして、受信した各リクエストを処理します。 PHP_CLI_SERVER_WORKERS環境変数を必要なワーカーの数に設定することで有効にできます。

 $ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080

この機能は、PHP 8.1 ではまだ実験的なものとしてマークされています。

概要

PHP には、アプリケーションをテストし、ローカル ネットワーク上でローカル ファイルシステムのコンテンツをすばやく公開するための便利な方法である組み込みの Web サーバーがあります。 PHP スクリプトの実行、キャッチオール ルーティング、および最も一般的な MIME タイプの静的ファイルをサポートします。

サーバーはオプションの分岐モードをサポートするようになりましたが、運用環境で使用することはお勧めできません。 これは開発支援を目的としており、パブリック デプロイに必要なカスタマイズ機能とセキュリティ機能が欠けています。 それが優れているのは、WAMP、XAMPP、Docker コンテナーなどの従来の開発プラットフォームに代わる軽量で統合された代替手段としてです。