PHPビルトインサーバーについて

採用はこちら

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

localhost127.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.phpindex.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内部から読み込むだけなので、外部に直接公開されません。

localhost127.0.0.10.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ビルトインサーバーについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次