PHPのビルトインサーバーを
LAN内に公開する

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

なぜ「localhost」ではダメなのか localhost このPC自身 127.0.0.1 ✗ 他端末から アクセス不可 LAN内の他端末 接続できない localhostは 自分だけを指す

ここで、hostnameを直接指定すればよいのではないかと考えました。

php -S myapp.local:8000 -t public
Code language: CSS (css)

一見すると正しそうです。
しかし、これではうまくいきません。
PHPのビルトインサーバー自体は「名前」を理解していないのです。
サーバーはIPアドレスに対して待ち受けます。
hostnameは、その前段階でIPに変換される必要があります。

2. IPアドレスに直接バインドしてみる

考え方を変え、「名前」ではなく「住所」を直接指定してみました。

IPアドレスに直接バインドしてみる 方法1: 特定IP指定 php -S 192.168.1.10:8000 そのIPアドレスでのみ待ち受け 方法2: すべて受付 php -S 0.0.0.0:8000 全インターフェースで待ち受け ✓ LAN内の他端末からアクセス可能 サーバー 各種端末 http://192.168.1.10:8000 でアクセス

まず、自分の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アドレスでのアクセスは確認できました。
ただ、毎回数字を入力するのは少し不便です。

hostnameでアクセスしたい場合 各端末の hosts ファイルを編集 192.168.1.10 myapp.local IPアドレスに別名を付ける ①ブラウザで入力 myapp.local:8000 ②名前解決 192.168.1.10 ③接続 hostnameは単なる別名(エイリアス)

もっとも手軽なのは、各端末の 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へ変換される。この関係を一度体験すると、設定の意味がはっきりします。

  1. localhostは一般的に127.0.0.1に解決されるループバックアドレスです。 – What is localhost and how does 127.0.0.1 work?
  2. 0.0.0.0を指定することで、すべてのネットワークインターフェースでリクエストを受け付けることができます。 – PHP: Built-in web server – Manual
  3. PHPの公式ドキュメントでは、ビルトインサーバーは開発支援を目的としており、本番環境や公開ネットワークでの使用は推奨されていません。シングルスレッドで動作し、リクエストを順次処理するため、パフォーマンスとセキュリティの観点から本番環境には適していません。 – PHP: Built-in web server – Manual
  4. hostsファイルを使用することで、ローカル環境でのホスト名とIPアドレスの対応を定義できます。PHPのビルトインサーバーでも仮想ホストとして動作させることができます。 – PHP: Built-in web server – Manual