PHP の組み込み Web サーバーで Web サイトをすばやくテストする方法
PHP アプリケーションをテストするために Web サーバーをすばやく起動する必要がありますか? PHP インタープリターには 1 つが組み込まれています。これを使用すると、Apache、NGINX、またはコンテナー化ソリューションを実行しなくても、作業をすばやく確認できます。
統合された PHP サーバーはあまり注目されていませんが、開発目的には十分強力です。このチュートリアルでは、どちらも PHP スクリプトを実行できないPython のSimpleHTTPServerやhttp-server npm パッケージなどの他のマイクロサーバーの代わりとして使用する方法を示します。
組み込みサーバーの使用
組み込みサーバーは、完全な HTTP サーバーがない環境で PHP サイトをテストするのに役立つ便利なメカニズムです。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
で、Web ブラウザに移動して、作業ディレクトリのコンテンツにアクセスできます。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 を確認することで、アプリケーション内の適切なポイントにユーザーを誘導できます。
ルーター スクリプトによって生成された出力は、クライアントに返される応答になります。例外は script returnfalse
です。この場合、PHP は元のリクエスト URI に一致する静的ファイルを返すようにフォールバックします。
PHP コードからの組み込みサーバーの検出
PHP コードは、アクティブなインターフェイスの名前を確認することで、組み込みの Web サーバーによって呼び出されているかどうかを判断できます。関数php_sapi_name()
はこの値を提供します。これはcli-server
、スクリプトが統合サーバー コンポーネントによって呼び出されるときに設定されます。
複数のリクエストを同時に処理する
デフォルトでは、サーバーは単一プロセスの同期モードで実行されます。リクエストは個別に処理され、完了するまで互いの実行をブロックします。これが、サーバーが本番環境での使用に適していない理由の 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 タイプの静的ファイルをサポートします。
サーバーはオプションの fork モードをサポートするようになりましたが、実稼働環境で使用することはお勧めしません。これは開発を支援することを目的としており、パブリック展開に必要なカスタマイズおよびセキュリティ機能が欠けています。それが優れているのは、 WAMP、XAMPP、および Docker コンテナーなどの従来の開発プラットフォームに代わる軽量で統合された代替手段としてです。
コメントを残す