ch02 6章中 2章目

ch02 — `php -S` 組み込みサーバー / ブラウザで動作確認

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch02 — `php -S` 組み込みサーバー / ブラウザで動作確認」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch02 — `php -S` 組み込みサーバー / ブラウザで動作確認」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch02 — `php -S` 組み込みサーバー / ブラウザで動作確認」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

PHP には php -S localhost:8000 という 組み込みの Web サーバー が標準で付いている。Apache や Nginx を別途入れずに、コマンド 1 発でローカルに Web サーバーが立ち、ブラウザから自作の PHP にアクセスできる。学習・開発用として最高に手軽で、本番運用は別物 (Apache/Nginx + PHP-FPM) と覚えておけばよい。

起動時の 2 つ目の引数として ルーター用の PHP ファイル を渡せる。このルーターが全リクエストを受け取り、$_SERVER['REQUEST_URI'] (今アクセスされている URL のパス) を見て応答を分岐させる。/hello なら挨拶、それ以外は 404、という世界一小さな Web アプリがここで書ける。

このチャプターのドリルは、CLI 採点ランナー上で動かすために $_SERVER['REQUEST_URI']stdin から組み立てるスタブ が冒頭に入る。php -S で動かすときはスタブが効かず本物のリクエスト由来の値が使われる、という二重構造。「採点用のおまじない」として読み飛ばして OK。

学習目標

  • php -S localhost:8000PHP 組み込みの Web サーバー を立てられる
  • ブラウザで http://localhost:8000/... を開いて自作 PHP を表示できる
  • リクエストの パス ($_SERVER['REQUEST_URI']) で応答を分けられる

ドリル

no 内容
01 リクエストパスが /hello なら "Hello, Web!"、それ以外なら "404" を出力

本物の動作確認 (任意・推奨)

実際にブラウザでも動かしてみたい場合:

# ドリルの answer.php がある場所に行く
cd topics/web/ch02-builtin-server/drill/01-respond-text/

# 組み込みサーバー起動 (Ctrl+C で停止)
php -S localhost:8000 answer.php

ブラウザで以下を開いて挙動を確認:

  • http://localhost:8000/helloHello, Web!
  • http://localhost:8000/nope404

採点ランナーは CLI 直実行なので、answer.php の冒頭で stdin から $_SERVER['REQUEST_URI'] を組み立てるスタブ が入っている。Web で動かすときは「stdin が無いので $_SERVER['REQUEST_URI'] を上書きしない」分岐になっていて、本物のリクエスト由来の $_SERVER['REQUEST_URI'] がそのまま使われる。「Web で動かす分にはスタブを消して良い」 という前提のおまじないとして理解する。

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. php -S 組み込みサーバー

    Lesson 12 / Chapter 2

  2. PHP には Web サーバーが入っている

    php -S localhost:8000
    • Apache や nginx をインストールしなくても、PHP だけで Web サーバーが立つ
    • localhost:80008000ポート番号 (好きに変えて良い)
    • 立てたあとブラウザで http://localhost:8000/ を開けば、その場のディレクトリの PHP が動く

    → 開発・学習用としては最も手軽。本番では使わないが、本コースではこれだけで十分

  3. 1 つの PHP を「全リクエストの受け口」にする

    # 起動: index.php をルーター扱いにする
    php -S localhost:8000 index.php
    • 第 2 引数にファイルを指定すると、全てのリクエスト がそのファイルに来る
    • どの URL でも index.php が呼ばれる
    • 分岐は $_SERVER['REQUEST_URI'] を見て自分で書く

    → これが「1 ファイルで Web アプリ」のミニマム構成。

  4. $_SERVER で「今のリクエスト」を知る

    <?php
    echo $_SERVER['REQUEST_METHOD']; // "GET" / "POST" / ...
    echo $_SERVER['REQUEST_URI'];    // "/hello?name=taro"
    キー 中身
    REQUEST_METHOD HTTP メソッド "GET" / "POST"
    REQUEST_URI リクエストされた URI "/hello?name=taro"
    HTTP_HOST ホスト名 "localhost:8000"
    • $_SERVERPHP が自動で作る連想配列 (スーパーグローバル)
    • 中身はリクエストごとに違う
  5. URI で応答を分けるミニ例

    <?php
    if ($_SERVER['REQUEST_URI'] === '/hello') {
        echo "Hello, Web!\n";
    } else {
        echo "404\n";
    }
    • /hello に来たら挨拶
    • それ以外は "404" と返す
    • これだけで「ルーター」の最小版
  6. 採点用スタブのおまじない

    <?php
    // 採点ランナーは CLI 直実行なので、stdin で REQUEST_URI を渡す
    $line = trim(fgets(STDIN) ?: '');
    if ($line !== '') {
        $_SERVER['REQUEST_URI'] = $line;
    }
    
    // 以降は本物の Web と同じ
    if ($_SERVER['REQUEST_URI'] === '/hello') {
        echo "Hello, Web!\n";
    } else {
        echo "404\n";
    }
    • stdin で来た 1 行を REQUEST_URI にセット → CLI でも分岐をテストできる
    • 本物の Web で動かすときは stdin が空 → スタブは何もせず、PHP が埋めた REQUEST_URI がそのまま使われる
    • 「採点と本物の両方で動かせる小細工」 と理解する
  7. このチャプターでできるようになること

    php -S localhost:8000 で組み込みサーバーを立てられる ✅ ブラウザで自作 PHP を表示できる ✅ $_SERVER['REQUEST_URI'] でリクエストパスを取れる ✅ 簡単な URI 分岐を書ける

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

Lesson 12 / Chapter 2


PHP には Web サーバーが入っている

php -S localhost:8000
  • Apache や nginx をインストールしなくても、PHP だけで Web サーバーが立つ
  • localhost:80008000ポート番号 (好きに変えて良い)
  • 立てたあとブラウザで http://localhost:8000/ を開けば、その場のディレクトリの PHP が動く

→ 開発・学習用としては最も手軽。本番では使わないが、本コースではこれだけで十分


1 つの PHP を「全リクエストの受け口」にする

# 起動: index.php をルーター扱いにする
php -S localhost:8000 index.php
  • 第 2 引数にファイルを指定すると、全てのリクエスト がそのファイルに来る
  • どの URL でも index.php が呼ばれる
  • 分岐は $_SERVER['REQUEST_URI'] を見て自分で書く

→ これが「1 ファイルで Web アプリ」のミニマム構成。


$_SERVER で「今のリクエスト」を知る

<?php
echo $_SERVER['REQUEST_METHOD']; // "GET" / "POST" / ...
echo $_SERVER['REQUEST_URI'];    // "/hello?name=taro"
キー 中身
REQUEST_METHOD HTTP メソッド "GET" / "POST"
REQUEST_URI リクエストされた URI "/hello?name=taro"
HTTP_HOST ホスト名 "localhost:8000"
  • $_SERVERPHP が自動で作る連想配列 (スーパーグローバル)
  • 中身はリクエストごとに違う

URI で応答を分けるミニ例

<?php
if ($_SERVER['REQUEST_URI'] === '/hello') {
    echo "Hello, Web!\n";
} else {
    echo "404\n";
}
  • /hello に来たら挨拶
  • それ以外は "404" と返す
  • これだけで「ルーター」の最小版

採点用スタブのおまじない

<?php
// 採点ランナーは CLI 直実行なので、stdin で REQUEST_URI を渡す
$line = trim(fgets(STDIN) ?: '');
if ($line !== '') {
    $_SERVER['REQUEST_URI'] = $line;
}

// 以降は本物の Web と同じ
if ($_SERVER['REQUEST_URI'] === '/hello') {
    echo "Hello, Web!\n";
} else {
    echo "404\n";
}
  • stdin で来た 1 行を REQUEST_URI にセット → CLI でも分岐をテストできる
  • 本物の Web で動かすときは stdin が空 → スタブは何もせず、PHP が埋めた REQUEST_URI がそのまま使われる
  • 「採点と本物の両方で動かせる小細工」 と理解する

このチャプターでできるようになること

php -S localhost:8000 で組み込みサーバーを立てられる ✅ ブラウザで自作 PHP を表示できる ✅ $_SERVER['REQUEST_URI'] でリクエストパスを取れる ✅ 簡単な URI 分岐を書ける

→ ドリルへ

この章で取り組む 演習問題の流れ (1ステップ)
  1. 01 ドリル 01 — リクエスト URI で応答を分ける README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 01 — リクエスト URI で応答を分ける

問題

リクエストされた URI に応じて応答を分ける PHP を書いてください。

  • $_SERVER['REQUEST_URI']"/hello" のとき → "Hello, Web!" を 1 行出力
  • それ以外のとき → "404" を 1 行出力

採点ランナーは CLI 直実行なので、標準入力の 1 行目$_SERVER['REQUEST_URI'] に代入してから処理してください (スタブはコードに含めて構いません)。

このドリルの入力例:

/hello

期待される出力:

Hello, Web!

ヒント

$_SERVER['REQUEST_URI'] = trim(fgets(STDIN) ?: '');
if ($_SERVER['REQUEST_URI'] === '/hello') { ... } else { ... }

本物の Web で確認したい場合

cd topics/web/ch02-builtin-server/drill/01-respond-text/
php -S localhost:8000 answer.php

ブラウザで http://localhost:8000/hello / http://localhost:8000/other を開く。

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(1問)

  1. ドリル 01 — リクエスト URI で応答を分ける

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます