PHPのビルトインサーバーは、ちょっとした検証や動作確認にとても便利です。
私も普段から php -S localhost:8000 を使って、ローカル環境で軽く動かしています。
ただし、同じネットワーク内の別の端末をみるには、一工夫が必要です。
php -S localhost:8000 -t public
Code language: CSS (css)
この状態で、自分のPCでは問題なく表示されます。
しかし、同じLANにあるスマートフォンや別のPCからは接続できません。
1. なぜ「localhost」ではダメなのか
調べてみると、理由は明確でした。localhost は「このPC自身」を指す特別な名前で、内部的には 127.0.0.1 というIPアドレスに結びついています1。
ここで、hostnameを直接指定すればよいのではないかと考えました。
php -S myapp.local:8000 -t public
Code language: CSS (css)
一見すると正しそうです。
しかし、これではうまくいきません。
PHPのビルトインサーバー自体は「名前」を理解していないのです。
サーバーはIPアドレスに対して待ち受けます。
hostnameは、その前段階でIPに変換される必要があります。
2. IPアドレスに直接バインドしてみる
考え方を変え、「名前」ではなく「住所」を直接指定してみました。
まず、自分のPCのローカルIPアドレスを確認しました。
多くの場合、192.168.x.x や 10.x.x.x の形式になります。
次に、次のように起動します。
php -S 192.168.1.10:8000 -t public
Code language: CSS (css)
または、すべての通信を受け付ける指定も使えます2。
php -S 0.0.0.0:8000 -t public
Code language: CSS (css)
この状態で別の端末から http://192.168.1.10:8000 にアクセスすると、画面が表示されました。
ここでようやく、LAN内に公開できたと実感しました。
ただし、PHPのビルトインサーバーはあくまで開発用です3。
LAN内とはいえ、誰でもアクセスできる状態になります。
一時的な確認には十分ですが、常時公開する用途ではないと理解できました。
3. hostnameでアクセスしたい場合の正体
IPアドレスでのアクセスは確認できました。
ただ、毎回数字を入力するのは少し不便です。
もっとも手軽なのは、各端末の hosts ファイルを編集する方法です4。
192.168.1.10 myapp.local
Code language: CSS (css)
この設定を行うと、ブラウザから http://myapp.local:8000 でアクセスできるようになります。hostnameは単なる別名だと理解すると整理できます。
3.1. LAN内DNSを使う方法
端末が多い場合は、ルーターやDNSサーバーで名前を管理する方法もあります。
今回は試していませんが、仕組み自体は同じです。
4. 試して理解すると構造が見えてくる
最初は、hostnameを指定すれば簡単に解決すると考えていました。しかし、失敗して調べ、手を動かすことで、通信の流れが見えてきました。
サーバーはIPで待ち受け、hostnameはその前にIPへ変換される。この関係を一度体験すると、設定の意味がはっきりします。
- localhostは一般的に127.0.0.1に解決されるループバックアドレスです。 – What is localhost and how does 127.0.0.1 work?
- 0.0.0.0を指定することで、すべてのネットワークインターフェースでリクエストを受け付けることができます。 – PHP: Built-in web server – Manual
- PHPの公式ドキュメントでは、ビルトインサーバーは開発支援を目的としており、本番環境や公開ネットワークでの使用は推奨されていません。シングルスレッドで動作し、リクエストを順次処理するため、パフォーマンスとセキュリティの観点から本番環境には適していません。 – PHP: Built-in web server – Manual
- hostsファイルを使用することで、ローカル環境でのホスト名とIPアドレスの対応を定義できます。PHPのビルトインサーバーでも仮想ホストとして動作させることができます。 – PHP: Built-in web server – Manual