`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:8000の8000は ポート番号 (好きに変えて良い)- 立てたあとブラウザで
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" |
$_SERVERも PHP が自動で作る連想配列 (スーパーグローバル)- 中身はリクエストごとに違う
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 を開く。