PHPビルトインサーバーとは、PHPに標準で用意されている開発用の簡易Webサーバーです。
ApacheやNginxなどのWebサーバーを別途用意しなくても、コマンドラインからPHPを実行するだけで、ローカル環境にWebサーバーを立ち上げられます。
基本的な起動コマンドは次の通りです。
php -S localhost:8000
このコマンドを実行すると、ブラウザから以下のURLにアクセスできます。
http://localhost:8000
PHPの学習、フォーム処理の確認、小規模なPHPスクリプトの動作確認などに便利です。
ただし、PHPビルトインサーバーはあくまで開発・テスト・デモ用途の機能です。
高負荷への対応やセキュリティ機能、細かなサーバー設定などは本番用Webサーバーほど充実していないため、本番環境で利用するべきではありません。
PHPビルトインサーバーの主な用途
PHPビルトインサーバーは、ローカル環境でPHPの動作を素早く確認したいときに役立ちます。
特に、ApacheやNginx、Docker、XAMPP、MAMPなどを用意するほどではない軽い検証に向いています。
PHPの学習に使える
PHPを学び始めた段階では、まずPHPファイルをブラウザで実行して動作を確認したい場面が多くあります。
たとえば、以下のような index.php を作成します。
<?php
echo 'Hello, PHP!';
このファイルがあるディレクトリで、次のコマンドを実行します。
php -S localhost:8000
ブラウザで以下にアクセスすると、PHPの実行結果を確認できます。
http://localhost:8000
画面には次のように表示されます。
Hello, PHP!
PHPの基本文法、条件分岐、配列、関数、フォーム処理などを確認するには十分です。
フォーム処理の確認に使える
PHPビルトインサーバーは、HTMLフォームとPHPの連携確認にも使えます。
たとえば、index.php にフォームを用意します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォームテスト</title>
</head>
<body>
<form method="post" action="submit.php">
<input type="text" name="username" placeholder="名前を入力">
<button type="submit">送信</button>
</form>
</body>
</html>
次に、submit.php を作成します。
<?php
$username = $_POST['username'] ?? '';
echo '送信された名前:' . htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
同じディレクトリでビルトインサーバーを起動します。
php -S localhost:8000
ブラウザでフォームを送信すると、$_POST の値をPHP側で受け取れることを確認できます。
小規模なPHPツールの確認に使える
PHPビルトインサーバーは、小さなPHPツールの動作確認にも向いています。
たとえば、以下のような用途です。
・簡単な計算ツール
・CSV読み込みツール
・お問い合わせフォームの検証
・APIレスポンスの確認
・Composerライブラリの動作確認
・簡易的な管理画面のプロトタイプ
本格的な開発環境を立ち上げる前に、まずPHPの処理だけ確認したい場合に便利です。
PHPビルトインサーバーの起動方法
PHPビルトインサーバーは、ターミナルやコマンドプロンプトから起動します。
基本の起動コマンド
基本形は次の通りです。
php -S ホスト名:ポート番号
よく使われるのは以下のコマンドです。
php -S localhost:8000
または、IPv4で明示したい場合は次のように指定します。
php -S 127.0.0.1:8000
localhost や 127.0.0.1 は、自分のPC自身を指します。
そのため、通常は自分のPC上のブラウザからアクセスします。
アクセスURLは次のようになります。
http://localhost:8000
または、
http://127.0.0.1:8000
ポート番号を変更する
ポート番号は 8000 でなければならないわけではありません。
たとえば、以下のように変更できます。
php -S localhost:8080
php -S localhost:3000
php -S localhost:8888
すでに他のアプリケーションが同じポートを使用している場合は、サーバーを起動できません。
その場合は、別のポート番号を指定します。
php -S localhost:8001
サーバーを終了する方法
起動中のPHPビルトインサーバーを終了するには、ターミナルで以下を押します。
Ctrl + C
Windows、macOS、Linuxのいずれでも、基本的にはこの方法で終了できます。
ドキュメントルートの指定方法
PHPビルトインサーバーでは、どのディレクトリをWeb公開ディレクトリにするかを指定できます。
この公開ディレクトリのことを、ドキュメントルートと呼びます。
カレントディレクトリをドキュメントルートにする
-t オプションを指定しない場合、コマンドを実行したディレクトリがドキュメントルートになります。
たとえば、以下のような構成があるとします。
my-site/
├── index.php
├── about.php
└── css/
└── style.css
my-site ディレクトリに移動して、次のコマンドを実行します。
php -S localhost:8000
すると、以下のようにアクセスできます。
http://localhost:8000/
http://localhost:8000/about.php
http://localhost:8000/css/style.css
手軽に確認したい場合は、この方法で十分です。
-t オプションで公開ディレクトリを指定する
実務に近い構成にするなら、公開ディレクトリを分けるのがおすすめです。
たとえば、次のような構成です。
my-app/
├── app/
│ └── functions.php
├── public/
│ ├── index.php
│ └── assets/
│ └── style.css
└── vendor/
この場合、public ディレクトリだけをWeb公開したいので、次のように起動します。
php -S localhost:8000 -t public
これにより、ブラウザから直接アクセスできるのは public 配下のファイルだけになります。
http://localhost:8000/
http://localhost:8000/assets/style.css
app/ や vendor/ は直接公開されません。
PHPアプリケーションでは、設定ファイルやライブラリ、内部処理用のファイルを外部に見せない設計が重要です。
そのため、実務寄りの構成では public ディレクトリをドキュメントルートにする方法がよく使われます。
index.php と index.html の扱い
PHPビルトインサーバーでは、ディレクトリにアクセスしたときに index.php または index.html が自動的に探されます。
ディレクトリアクセス時に自動表示される
たとえば、次のような構成があるとします。
public/
└── index.php
この状態で以下にアクセスすると、
http://localhost:8000/
public/index.php が実行されます。
ファイル名を明示しなくても、ディレクトリの代表ファイルとして index.php が読み込まれます。
親ディレクトリまで探索される場合がある
PHPビルトインサーバーの仕様では、リクエストされたURIが具体的なファイルを指していない場合、まず該当ディレクトリ内の index.php または index.html を探します。
見つからない場合は、ドキュメントルートに到達するまで親ディレクトリ側も探索します。
つまり、単に「現在のディレクトリだけを見る」というより、一定の範囲で index.php または index.html を探す挙動があります。
入門段階では深く意識しなくても問題ありませんが、ルーティングや PATH_INFO を扱う場合は、この仕様を知っておくと理解しやすくなります。
静的ファイルの配信
PHPビルトインサーバーは、PHPファイルだけでなく、CSS、JavaScript、画像などの静的ファイルも配信できます。
CSSやJavaScriptも読み込める
たとえば、次のような構成にします。
public/
├── index.php
├── css/
│ └── style.css
├── js/
│ └── main.js
└── images/
└── logo.png
この場合、以下のようにアクセスできます。
http://localhost:8000/css/style.css
http://localhost:8000/js/main.js
http://localhost:8000/images/logo.png
HTML側では、通常のWebサイトと同じようにCSSやJavaScriptを読み込めます。
<link rel="stylesheet" href="/css/style.css">
<script src="/js/main.js"></script>
そのため、PHPだけでなく、小規模なWebページやLPのローカル確認にも利用できます。
対応しているMIMEタイプには範囲がある
一般的なCSS、JavaScript、HTML、JPEG、PNG、SVG、PDFなどは問題なく扱えます。
ただし、特殊な拡張子のファイルを配信したい場合は、標準のMIMEタイプ判定だけでは対応できないことがあります。
その場合は、ルータースクリプトで Content-Type ヘッダーを明示して、readfile() などでファイルを返す必要があります。
たとえば、独自拡張子のファイルや特殊なデータファイルをブラウザに返す場合は注意しましょう。
ルータースクリプトの使い方
PHPビルトインサーバーでは、起動時にPHPファイルを指定すると、そのファイルをルータースクリプトとして使えます。
ルータースクリプトを使うと、存在しないURLを index.php に集約したり、簡易的なルーティングを行ったりできます。
ルータースクリプトとは
基本の起動コマンドは次の通りです。
php -S localhost:8000 router.php
この場合、各リクエストの開始時に router.php が実行されます。
router.php の中で return false; を返すと、PHPビルトインサーバーはリクエストされたファイルを通常通り返します。
一方、return false; しなかった場合は、ルータースクリプト側でレスポンスを組み立てます。
静的ファイルをそのまま返すルーター
よく使われるルータースクリプトの例は次の通りです。
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$file = __DIR__ . $path;
if ($path !== '/' && is_file($file)) {
return false;
}
require __DIR__ . '/index.php';
このコードでは、実在する静的ファイルがあればそのまま返します。
たとえば、以下のようなファイルです。
/css/style.css
/js/main.js
/images/logo.png
一方、実在しないURLにアクセスされた場合は、index.php に処理を集約します。
/about
/contact
/products/123
このようなURLをすべて index.php で処理したい場合に便利です。
file_exists() より is_file() が適している理由
ルータースクリプトでは、静的ファイルの存在確認に file_exists() を使う例もよくあります。
ただし、実在するファイルだけを返したい場合は、is_file() の方が意図が明確です。
if ($path !== '/' && is_file($file)) {
return false;
}
file_exists() は、ファイルだけでなくディレクトリにも true を返します。
一方、is_file() は通常のファイルである場合に true を返します。
そのため、「静的ファイルが存在する場合はそのまま返す」という処理では、is_file() の方が安全です。
簡易ルーティングの実装例
PHPビルトインサーバーとルータースクリプトを使うと、簡単なルーティングを実装できます。
ディレクトリ構成
以下のような構成にします。
my-app/
├── index.php
└── router.php
router.php の例
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$file = __DIR__ . $path;
if ($path !== '/' && is_file($file)) {
return false;
}
require __DIR__ . '/index.php';
index.php の例
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
switch ($path) {
case '/':
echo 'トップページ';
break;
case '/about':
echo '会社概要ページ';
break;
case '/contact':
echo 'お問い合わせページ';
break;
default:
http_response_code(404);
echo 'ページが見つかりません';
break;
}
起動コマンド
php -S localhost:8000 router.php
この状態で、以下のURLにアクセスできます。
http://localhost:8000/
http://localhost:8000/about
http://localhost:8000/contact
.htaccess を使わなくても、PHPだけでURLルーティングの基本を試せます。
public ディレクトリを使った実務寄りの構成
PHPアプリケーションでは、公開するファイルと内部処理用のファイルを分ける構成がよく使われます。
その場合は、public ディレクトリをドキュメントルートに指定します。
おすすめのディレクトリ構成
my-app/
├── app/
│ └── functions.php
├── public/
│ ├── index.php
│ ├── css/
│ │ └── style.css
│ └── js/
│ └── main.js
└── router.php
起動コマンド
php -S localhost:8000 -t public router.php
このコマンドでは、public ディレクトリをドキュメントルートにしつつ、router.php をルータースクリプトとして使います。
router.php の例
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$file = __DIR__ . '/public' . $path;
if ($path !== '/' && is_file($file)) {
return false;
}
require __DIR__ . '/public/index.php';
public/index.php の例
<?php
require __DIR__ . '/../app/functions.php';
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
switch ($path) {
case '/':
echo 'トップページ';
break;
case '/about':
echo '会社概要ページ';
break;
case '/contact':
echo 'お問い合わせページ';
break;
default:
http_response_code(404);
echo 'ページが見つかりません';
break;
}
この構成では、ブラウザから直接見えるのは public 配下だけです。
app/ 配下のファイルはPHP内部から読み込むだけなので、外部に直接公開されません。
localhost、127.0.0.1、0.0.0.0 の違い
PHPビルトインサーバーを起動するときは、ホスト名の指定にも注意が必要です。
localhost の意味
通常、以下のように起動します。
php -S localhost:8000
この場合、自分のPC上で動作するサーバーにアクセスします。
http://localhost:8000
ただし、環境によっては localhost がIPv6の ::1 に解決されることがあります。
IPv4で確実にアクセスしたい場合は、次のように指定するとよいでしょう。
php -S 127.0.0.1:8000
127.0.0.1 の意味
127.0.0.1 は、自分のPC自身を表すIPv4のループバックアドレスです。
ローカル環境でPHPを確認するだけなら、以下の指定で十分です。
php -S 127.0.0.1:8000
ブラウザでは次のURLにアクセスします。
http://127.0.0.1:8000
0.0.0.0 の意味
同じLAN内の別端末からアクセスしたい場合は、次のように指定することがあります。
php -S 0.0.0.0:8000
この指定にすると、PCのローカルIPアドレスを使って、同じネットワーク内のスマホや別PCからアクセスできる場合があります。
たとえば、PCのローカルIPアドレスが 192.168.1.10 なら、スマホのブラウザで以下にアクセスします。
http://192.168.1.10:8000
ただし、0.0.0.0 で起動すると外部からアクセスできる範囲が広がる可能性があります。
PHPビルトインサーバーは本番公開用ではないため、公開ネットワーク上で使うべきではありません。
PHPビルトインサーバーのログ
PHPビルトインサーバーを起動すると、ターミナルにアクセスログやエラー情報が表示されます。
起動時のログ
起動すると、次のようなログが表示されます。
PHP 8.x.x Development Server (http://localhost:8000) started
この表示が出れば、サーバーは起動しています。
アクセス時のログ
ブラウザからアクセスすると、ターミナル側にログが出ます。
[200]: GET /
[404]: GET /not-found
PHPでエラーが発生した場合も、ターミナルにエラーメッセージが表示されることがあります。
ブラウザの表示だけでなく、ターミナル側のログも確認すると、原因を見つけやすくなります。
PHPビルトインサーバーの注意点
PHPビルトインサーバーは便利ですが、本格的なWebサーバーとは異なります。
使用する際は、いくつかの注意点を理解しておく必要があります。
本番環境では使わない
PHPビルトインサーバーは、開発用の簡易サーバーです。
本番環境で使うべきではありません。
主な理由は次の通りです。
・高負荷に耐える設計ではない
・セキュリティ機能が限定的
・アクセス制御やログ管理が不十分
・HTTPS/TLSの本格運用に向いていない
・リバースプロキシや細かなサーバー設定に向いていない
・ApacheやNginxのような本番運用向けの機能がない
公開サイトや商用サイトでは、Apache、Nginx、PHP-FPMなどを使うのが一般的です。
標準では単一プロセスで動作する
PHPビルトインサーバーは、標準では単一のシングルスレッドプロセスとして動作します。
そのため、1つのリクエストが長時間処理を行っていると、他のリクエストも待たされる可能性があります。
たとえば、以下のような処理には注意が必要です。
・外部APIへの長いリクエスト
・大きなファイルの読み込み
・重い画像処理
・sleep() を使った処理
・時間のかかるDB処理
PHP 7.4以降では、環境変数 PHP_CLI_SERVER_WORKERS を使って複数ワーカーを試すこともできます。
ただし、この機能は実験的な位置づけであり、Windowsではサポートされません。
また、本番利用に適した機能ではありません。
.htaccess は効かない
PHPビルトインサーバーはApacheではありません。
そのため、Apache用の .htaccess は基本的に処理されません。
WordPressや一部のPHPアプリケーションでは、.htaccess によるURLリライトを前提にしている場合があります。
PHPビルトインサーバーで同じような挙動を再現したい場合は、ルータースクリプトを使います。
$_SERVER の値が本番環境と異なることがある
PHPでは、リクエスト情報を $_SERVER で取得できます。
ただし、$_SERVER の内容はWebサーバーやPHPの実行方式によって変わることがあります。
たとえば、以下の値は環境差に注意が必要です。
$_SERVER['REQUEST_URI']
$_SERVER['SCRIPT_NAME']
$_SERVER['SCRIPT_FILENAME']
$_SERVER['DOCUMENT_ROOT']
$_SERVER['PATH_INFO']
$_SERVER['SERVER_SOFTWARE']
PHPビルトインサーバーで動いたコードが、ApacheやNginx環境で完全に同じ挙動になるとは限りません。
学習や簡易検証には十分ですが、本番と同じ環境を厳密に再現する用途には向いていません。
HTTPSの検証には向かない
PHPビルトインサーバーは、HTTPで簡易的にPHPを動かす用途には便利です。
しかし、HTTPS/TLSを前提にした検証には向いていません。
以下のような確認が必要な場合は、別の環境を使った方がよいです。
・SSL証明書の確認
・HTTPSリダイレクト
・CookieのSecure属性
・OAuthのコールバックURL
・Mixed Contentの確認
・本番に近いセキュリティ検証
HTTPSを含めて確認したい場合は、Docker、Nginx、Caddy、mkcert、Local、Laravel Herd、ステージング環境などを検討しましょう。
WordPress開発で使えるか
PHPビルトインサーバーでも、工夫すればWordPressを動かせる場合はあります。
ただし、本格的なWordPress開発にはあまり向いていません。
WordPressではWebサーバー設定が重要
WordPressでは、PHPだけでなく以下の要素も関係します。
・MySQLまたはMariaDB
・パーマリンク設定
・.htaccess
・ApacheやNginxのリライトルール
・アップロードディレクトリ
・メール送信
・キャッシュ系プラグイン
・REST API
・テーマやプラグインのサーバー依存挙動
PHPビルトインサーバーでは、これらを本番に近い形で再現しにくい場合があります。
WordPressでは専用のローカル環境がおすすめ
WordPress案件の制作や検証では、以下のような環境の方が実務向きです。
・Local
・XAMPP
・MAMP
・Docker
・DDEV
・Laravel Herd
・レンタルサーバーのステージング環境
PHPビルトインサーバーは、WordPress本体の本格開発というより、PHPの動作確認や小さな検証に使うものと考えるとよいでしょう。
ApacheやNginxとの違い
PHPビルトインサーバーとApache・Nginxは、用途が大きく異なります。
PHPビルトインサーバーは開発用
PHPビルトインサーバーは、手軽に起動できる反面、本格的なサーバー機能は限定的です。
ローカルでPHPを試したいときには便利ですが、公開サイトの運用には向いていません。
ApacheやNginxは本番運用向け
ApacheやNginxは、本番環境で多く使われるWebサーバーです。
アクセス制御、ログ管理、TLS、リバースプロキシ、キャッシュ、負荷対策など、運用に必要な機能が充実しています。
Nginxの場合、PHPを直接実行するのではなく、通常はPHP-FPMへ処理を渡します。
Apacheの場合は、mod_php や PHP-FPM などの構成があります。
違いの比較表
| 項目 | PHPビルトインサーバー | Apache / Nginx |
|---|---|---|
| 主な用途 | ローカル開発・テスト | 本番運用・本格開発 |
| 導入の手軽さ | 非常に簡単 | 設定が必要 |
| PHPの実行 | 可能 | 可能 |
| 静的ファイル配信 | 可能 | 可能 |
| URLリライト | ルータースクリプトで簡易対応 | 設定ファイルや .htaccess で対応 |
| 高負荷対応 | 不向き | 向いている |
| HTTPS運用 | 不向き | 向いている |
| セキュリティ設定 | 限定的 | 詳細に設定可能 |
| 本番利用 | 非推奨 | 一般的 |
よくあるエラーと対処法
PHPビルトインサーバーを使う際によくあるエラーも確認しておきましょう。
php: command not found
このエラーは、PHPがインストールされていない、またはコマンドラインからPHPを実行できない場合に表示されます。
まずは以下を実行して、PHPが使えるか確認します。
php -v
PHPのバージョン情報が表示されれば問題ありません。
表示されない場合は、PHPのインストールやPATH設定を確認します。
Failed to listen on localhost:8000
このエラーは、指定したポートがすでに使われている場合に発生することがあります。
たとえば、8000 番ポートが使用中なら、別のポートに変更します。
php -S localhost:8001
または、
php -S localhost:8080
CSSや画像が読み込まれない
CSSや画像が読み込まれない場合は、ファイルパスが間違っている可能性があります。
たとえば、HTMLで以下のように指定している場合、
<link rel="stylesheet" href="/css/style.css">
ドキュメントルート直下に以下のファイルが必要です。
css/style.css
-t public を使っている場合は、public/css/style.css に配置する必要があります。
public/
└── css/
└── style.css
ルーティングがうまくいかない
/about や /contact のようなURLにアクセスして404になる場合は、ルータースクリプトを使っていない可能性があります。
存在しないファイルへのアクセスを index.php に集約したい場合は、次のように起動します。
php -S localhost:8000 router.php
または、public ディレクトリを使う場合は次のようにします。
php -S localhost:8000 -t public router.php
PHPビルトインサーバーを使うべき場面
PHPビルトインサーバーは、使いどころを選べば非常に便利です。
向いている用途
以下のような用途には向いています。
・PHPの学習
・小さなPHPファイルの動作確認
・フォーム処理の確認
・GET / POST の確認
・Composerライブラリの簡易検証
・簡単なAPIモック作成
・ルーティングの学習
・ローカルでの短時間のデモ
複雑な環境構築をせず、すぐにPHPをブラウザで確認したい場合に適しています。
向いていない用途
一方で、以下の用途には向いていません。
・本番公開
・商用サイトの運用
・大規模アクセスを想定した検証
・本番サーバーと同じ挙動の確認
・HTTPSを含む本格的な検証
・WordPress案件の本格開発
・ApacheやNginx固有の設定確認
本番に近い環境で検証したい場合は、Apache、Nginx、PHP-FPM、Docker、DDEV、Localなどを使う方が適しています。
PHPビルトインサーバーのおすすめ構成
最後に、用途別のおすすめ構成を紹介します。
学習用の最小構成
PHPを学習するだけなら、以下のような最小構成で十分です。
php-test/
└── index.php
index.php は次のようにします。
<?php
echo 'PHPビルトインサーバーで動いています';
起動コマンドは以下です。
cd php-test
php -S localhost:8000
ブラウザで以下にアクセスします。
http://localhost:8000
これだけでPHPの実行結果を確認できます。
実務寄りの構成
実務に近い形で練習するなら、以下のように公開ディレクトリを分ける構成がおすすめです。
my-app/
├── app/
│ └── functions.php
├── public/
│ ├── index.php
│ ├── css/
│ │ └── style.css
│ └── js/
│ └── main.js
└── router.php
起動コマンドは次の通りです。
php -S localhost:8000 -t public router.php
この構成にすると、外部に公開するファイルと内部処理用のファイルを分けられます。
PHPフレームワークの基本的な考え方にも近いため、LaravelやSymfonyなどを学ぶ前の練習にもなります。
まとめ
PHPビルトインサーバーは、PHPに標準で用意されている開発用の簡易Webサーバーです。
ApacheやNginxを用意しなくても、次のコマンドだけでローカルサーバーを起動できます。
php -S localhost:8000
公開ディレクトリを指定する場合は、次のようにします。
php -S localhost:8000 -t public
ルータースクリプトを使う場合は、次のように起動します。
php -S localhost:8000 router.php
または、public ディレクトリと組み合わせるなら以下です。
php -S localhost:8000 -t public router.php
PHPビルトインサーバーは、PHP学習、フォーム処理の確認、簡単なルーティングの練習、小規模なPHPスクリプトの検証に向いています。
一方で、標準では単一プロセスで動作し、セキュリティ機能や本番運用向けの機能は限定的です。
.htaccess も基本的には使えず、ApacheやNginxと完全に同じ挙動にはなりません。
そのため、PHPビルトインサーバーはローカル開発・学習・テスト用として使い、本番環境ではApache、Nginx、PHP-FPMなどを利用するのが適切です。
以上、PHPビルトインサーバーについてでした。
最後までお読みいただき、ありがとうございました。










