採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

`php -S` 組み込みサーバー

テクノロジ系 / web (HTTP / $_GET / $_POST / form / php -S)

php -S 組み込みサーバー

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_METHODHTTP メソッド"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 分岐を書ける

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

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

問題

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

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

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

このドリルの入力例:

/hello

期待される出力:

Hello, Web!

採点

php scripts/grade.php topics/web/ch02-builtin-server/drill/01-respond-text/

ヒント

$_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 を開く。