『Webアプリケーション構築入門』の郵便番号検索システムをAppFog上で動かす方法

ウェブアプリ構築の入門書である拙著『Webアプリケーション構築入門 第2版』のゴールは、Google Mapsを活用する郵便番号検索システムです。サーバ・サイドのプログラミング言語はJavaとPHPのうち、好きな方を選んで読み進められるようになっています。

ウェブアプリを構築できるようになると、こんどはそれを公開したくなるわけですが、本書の想定読者には学生も入っているので、「まずサーバを用意して・・・」のようなコストのかかる方法ではなく、基本無料の公開方法が必要です。

Java版をHerokuで公開する方法と、PHP版をPHP Fogで公開する方法を以前紹介したのですが、PHP Fogが今年いっぱいでサービスを終了し、AppFogに移行するらしいので、それにあわせてAppFogを試します。

PHP Fogでは、無料では機能が不十分なMySQLを避けてSQLiteを使いましたが、AppFogのMySQLは容量が100MBあるので、郵便番号検索のためには十分です(逆にSQLiteは使えなくなりました。使えれば、移植作業は楽だったのですが)。(参考:AppFog Pricing

作業は以下の通りです。(Ubuntu 12.10 Desktopで動作を確認しました。)

1. AppFogのアカウントを作る。

2. コマンドラインツールをインストールする。(参考:AF Command Line Tool)

sudo apt-get install ruby
sudo gem install af

3. ログインする。

af login

4. アプリを作成し、そこにMySQLサービスを追加、バインドする(ここ、かなり説明を端折っています)。

af bind-service {サービス名} {アプリ名}

5. データベースを準備する。

sudo apt-get install ruby-dev g++ mysql-client libssl-dev
sudo gem install caldecott
sudo gem install eventmachine -- --with-openssl-dir=/usr/lib/ssl
af tunnel

指示に従うとmysqlコマンドで接続できるようになります。あらかじめmysqldumpでデータベースをバックアップしておいて、以下のようなコマンドで復元します。

mysql> source {ファイル名}

6. ソースコードをアップロードする。

cd {コードのあるディレクトリ}
af update {アプリ名}

AppFogの流儀にあわせて、MySQLに接続する部分のコードを次のように書き換えておく必要があります(PHPのバージョンが比較的新しいので、接続時に文字コードを設定できます)。(参考:AppFog Docs MySQL)

//データベースに接続
$services_json = json_decode(getenv("VCAP_SERVICES"),true);
$mysql_config = $services_json["mysql-5.1"][0]["credentials"];
$user = $mysql_config["username"];
$pass = $mysql_config["password"];
$host = $mysql_config["hostname"];
$port = $mysql_config["port"];
$dbname = $mysql_config["name"];
$db = new PDO("mysql:host=$host;port=$port;dbname=$dbname;charset=utf8", $user, $pass);

実行結果は下のようになります。