PHPのビルトインウェブサーバーを活用して動作確認を捗らす話
この記事は賞味期限切れです。(更新から1年が経過しています)
PHPのビルトインウェブサーバーについては以前も軽く触れたのですが、 今回はもう少し細かく噛み砕きつつ、仮想マシンからホストOS(Win/Mac)のサーバーにアクセスして動作確認を捗らせてみます。
まえおき
やりたいこと
- 仮想マシン(Windows)で、ローカルで制作中のWebサイトの動作確認をしたい。
- せっかくなのでhttpアクセスで閲覧したい。
- でもどこかにアップロードしたりローカルサーバ構築したりするのはめんどう。
- せっかちなのでDropboxの同期をまっている心の余裕がない。
こういう時にはPHPビルトインウェブサーバーが簡単でおすすめです。
- 好きなディレクトリをドキュメントルートにしてコマンド一発で即時に簡易Webサーバが立ち上がります。
- ログがターミナルに流れるのでわかりやすく、どことなくテンションがあがります。
- ちょっとしたPHPのスクリプトを確認できるオマケつき。
- ルータースクリプトも使える。
別にやりたくないこと
- PHPの動作確認はちゃんと仮想マシン上のLinux等の開発環境で行います。
(できるだけ本番環境にあわせてチェックを行いたいですし、 PHPを弄る様な方ならば素直にLinux環境のVMで環境構築した方が断然楽だと思います。)
ビルトインウェブサーバーの使い方
PHP5.4+ の導入
ここでは詳しく触れませんが、ビルトインウェブサーバーを使用するにはPHP5.4以降が必要です。 Windowsでもすぐに動くバイナリが配布されていますし、Macならmacportsやhomebrewで導入も容易だと思います。
- PHP For Windows: Binaries and sources Releases
- The MacPorts Project — Home
- Homebrew — OS X用パッケージマネージャー
ビルトインウェブサーバーの起動
詳しくは上のURLにある通りです。php
コマンドに -S
オプションを渡す事でウェブサーバーを起動することができます。 その他オプションの書式は下記のようになります。
$ php -S <ホスト名>:<ポート番号> -t <ドキュメントルートのパス>
例えば、localhostの8080番ポートで、 “public_html” ディレクトリをドキュメントルートとしてWebサーバを立ち上げる場合は次のようになります。
$ php -S localhost:8080 -t public_html
仮想マシンから確認する
ホスト名がlocalhostでは仮想環境からアクセスする事ができません。 そこで、次のようにホスト名を “0.0.0.0” にして起動する事で外部から接続できるようになります。
$ php -S 0.0.0.0:8080 -t public_html
例えばサーバを起動するマシンのローカルIPアドレスが 192.168.10.3 などだった場合、 仮想マシンのゲストOSから “http://192.168.10.3:8080” へアクセスすれば直接動作確認をする事ができるようになります。 (これはあくまで一例で、アクセス先のアドレスは仮想マシンのネットワーク設定によって様々なので注意しましょう)
IEの確認には、Microsoft提供の modern.ie が便利です。 昔はVrtualPC用のイメージだけだったのですが、modern.ie になってからはVirtualBox、VMWare、Parallels等、 様々なプラットフォーム用の仮想マシンイメージを配布しています。
ルータースクリプトを使う
このビルトインウェブサーバーの素敵なポイントの一つに、ルータースクリプト を簡単に使用出来るという利点があります。 ざっくり言うと、Apacheのmode_rewriteのような処理がPHPスクリプトを通じて行えるようになる代物です。
例えばこれは、Wordpress の .htaccess にある mod_rewrite の記述です。 この記述のおかげで WordPress はURLをデザインする事が出来るわけですね。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
ここで記述されているルールは非常に単純で、 「アクセスされたURLにあたるファイルやディレクトリが存在しない場合は、index.phpでレスポンスを返す」だけです。 同様の処理をPHPのルータースクリプトで記述してみましょう。
<?php
/* _router.php */
if(file_exists($_SERVER["REQUEST_FILENAME"])){
// false を返すとリクエストされたリソースをそのまま返します
return false;
} else {
require "index.php";
}
あとは、この内容を記述した “_router.php” をコマンドに渡すだけです。
$ php -S 0.0.0.0:8080 -t public_html public_html/_router.php
mod_rewrite のような処理を簡単にテストしたい場合や、 History.pushState を使った構成で制作を進める時などに重宝しています。
Gruntタスクで起動する
Gruntを使って開発をされている方は、grunt-contrib-connect のような感じで開発用サーバを起動したいと考えるでしょう。 ちょうどそのようなプラグインが公開されていたので、ここはひとつ活用させて頂きます。
タスク設定例:
grunt.initConfig({
php: {
dist: {
options: {
port: 8080,
hostname: "0.0.0.0",
base: "public_html",
router: "_router.php",
keepalive: true
}
}
}
});
router のパスは base からの相対パスになります。
JavaScriptやCSSのコンパイル等で watch タスクを利用している場合は、サーバーの起動と同時に行えるようにしたいですね。 その際には keepalive
を false にし、次のように watch の前に登録して起動します。
// `$ grunt dev` で起動
grunt.registerTask("dev", ["php:dist", "watch"]);
Grunt で php を扱うプラグインにはこの他にも ddprrt/connect-php があります。 こちらは grunt-conrib-connect のミドルウェアとして動かすタイプのライブラリで、 5.4+ でなくても動くかわりに、ルータースクリプト等は使えなさそうです。gruntベースで自前で書けという事でしょう。
また、プラグインを探していた当初、grunt-php が見つからなかった為、 ほぼ同じような動作をする物を自前で書いて使っていたのは秘密です。 私が書いた物よりも grunt-php の方が優秀そうなので、何も書かなかった事にしました。 grunt-php に無くて自前の物にある機能といえばアクセスログの出力ぐらいで、オプションの名前などもほとんど同じでした。 どちらも grunt-contrib-connect を参考にしているので当たり前ですね。
まとめ
単純に確認用のサーバを起動したいのならば grunt-contrib-connect で十分なのですが、 URLのリライト等をしたい場合などはPHPビルトインウェブサーバーの方が楽に設定出来る気がします。 Gruntを使わない人でも簡単に扱えるは大きなメリットですね。
コメント