PHP 5.4のビルトインウェブサーバー機能

PHP 5.4では、「ビルトインウェブサーバー」という機能が追加されました。
PHPのマニュアルによると「開発用としてのみ設計されたものであり、 実運用に使ってはいけません。」ということですが、今後に期待できそうな機能です。

1.概要

ビルトインウェブサーバー機能は、コマンドライン版のPHPが、ウェブサーバーのように動作する機能です。
PHPとプログラムをメモリに常駐させておくことができますので、プログラム起動時のオーバーヘッドを減らすことができます。
巨大化したPHPアプリケーションで、レスポンスを上げるのに役立つはずです。

2.基本的な使い方

まず、サーバーの処理をするPHPのプログラムを作り、サーバーのディレクトリに保存します。
そして、そのディレクトリをカレントにして、以下のようなコマンドを入力します。

php -S 0.0.0.0:<ポート番号> ファイル名

例えば、router.phpというPHPで、8000番ポートへのリクエストを処理するなら、以下のコマンドを入力します。

php -S 0.0.0.0:8000 router.php

サーバー用のプログラムでは、従来と同様に、リクエストに応じてprint等の文で結果を返します。
例えば、router.phpの内容を以下のようにするとします。

print 'Hello, world.';

そして、サーバーを起動した後、クライアントのWebブラウザで、「http://サーバーのホスト名:ポート番号/」にアクセスします。
すると、Webブラウザに「Hello, world.」と表示されます。

3.リクエストの振り分け

従来のPHPのプログラムと同様に、$_SERVER['REQUEST_URI']で、リクエストされたURIを得ることができます。
また、$_GETや$_POSTの変数も使うことができます。
これらの変数を利用して、リクエストを振り分けて、それぞれに応じた出力を行うこともできます。

例えば、「http://サーバーのホスト名:ポート番号/login.html」にアクセスがあった時には、ログインのページを出力したいとします。
また、「http://サーバーのホスト名:ポート番号/admin.html」にアクセスがあった時には、管理画面のページを出力したいとします。
また、上記以外のアドレスにアクセスがあった時には、「Not Found」を出力したいとします。
この場合だと、以下のようなプログラムを作り、サーバーとして起動します。

<?php
if (preg_match('/^\/login.html/', $_SERVER['REQUEST_URI'])) {
    ログインページを出力
}
else if (preg_match('/^\/admin.html/', $_SERVER['REQUEST_URI'])) {
    管理画面のページを出力
}
else {
    header('HTTP/1.0 404 Not Found');
    print 'Not found';
}
?>