Kikuchy's Second Memory

技術のこととか、技術以外のこととか、思ったことを書き留めています。

Azure Web site で FuelPHP を動かして migration までやってみた

以前は CakePHP を使っていたのですが、最近の PHP 界隈では FuelPHP というフレームワークがメジャーなようなので、そちらを使ってみる事に。
ついでに Windows Azure を少しの間無料で使えるサブスクリプションを手に入れたので、


ついでだから、 Windows AzureFuelPHP を動かしてしまおう!


ということで、やって見ました。
なかなか大変でした。

環境

方針

Windows Azure 環境は、 production 環境(製品版)として使用します。
開発やテストはローカルで行う感じ。
git を使ってデプロイを行うようにします。ローカルの git リポジトリのみを使います。
また、 git pull 時に自動的に migration (データベース自動構成)も行うように仕向けます。

手順

1. Web site を作る

Windows Azure のポータルにログインしたら、早速 Web site を作ります。
ここの章の内容は、PHP web site with MySQL and Git - Windows Azure tutorial の手順と同じです。


f:id:kikuchy:20130913220932p:plain

右下の “New" から“Compute" -> “Web site" -> “Custom Create" を選択します。



f:id:kikuchy:20130913221127p:plain

ウィザードが始まります。
Web site の名前(今回は “fuelazure" にしました)を決定し、Region は主な対象ユーザーに近い地域、Database は “Create a new MySQL database" にします。 デプロイに git を使いたいので“Publish from source control" のチェックを入れておきます。


f:id:kikuchy:20130913221749p:plain

次に MySQL のデータベース名を決める画面になります。が、別に何でも困らないので、今回はそのままにしました。規約に同意して次へ。


f:id:kikuchy:20130913221855p:plain

ソース管理の仕方について聞かれます。今回はローカルの git しか使わないつもりなので、“Local Git repository" を選びます。


f:id:kikuchy:20130913222218p:plain

ポータル画面に戻ってしばらくすると、先ほど作った Web site が出来上がっています。
次はこれの設定に移ります。

2. Web site の設定

先ほど作った Web site の CONFIGURE の画面を開きます。


f:id:kikuchy:20130913222821p:plain

PHP のバージョンを 5.4 に設定します。 FuelPHP の動作のためには PHP 5.3 以上であれば良いのですが、まあ新しい方が良いだろう、っていうだけの判断です。


f:id:kikuchy:20130913223333p:plain

設定画面に書かれている、 git リポジトリのURLをコピーしておきます。後で使用します。


f:id:kikuchy:20130913223533p:plain

app settings の項目で環境変数を指定できるので、新しい項目のKEYを “FUEL_ENV" に、VALUEを “PRODUCTION" にしておきます。
こうすると、Web site 上の FuelPHP が production 環境で動作します。


設定項目は以上です。SAVE を押下して保存しておきます。

3. FuelPHP を用意する

ここからはローカルでの作業になります。

適当な作業ディレクトリで、oil コマンドを使って新しいアプリケーションの準備をします。
今回は “fuelazure" という名前でアプリケーションを用意しました。

$ oil create fuelazure
$ cd fuelazure

ご存知かも知れませんが、oil コマンドは中で git を実行して最新の FuelPHP を clone してくるものなので、この fuelazure はすでに git の管理下に置かれています。

まずは master ブランチを作って、そのブランチに移動します。

$ git heckout -b master

Windows Azure の初期設定では、 master ブランチのコミットをデプロイするようになっているため、この手順が必要です。
FuelPHP の開発ブランチの上で自分のアプリの開発を続けるというのが気持ち悪い、というためでもあります。

Azure をリモートリポジトリに追加します。

$ git remote add azure <設定画面でコピーして来たgitリポジトリのURL>

カスタムデプロイ用のスクリプトを用意します。ファイルが増えますので、リポジトリに追加しておきます。

$ azure site deploymentscript --php
$ git add .deployment deploy.sh

カスタムデプロイ用のスクリプトを編集します。
Composer (PHP のパッケージ依存関係解決ツール)の自動実行と、migration を行うようにします。
“deploy.sh" を以下のように編集します。


deploy script to run FuelPHP migration on Windows ...

URL の ReWrite の設定をします。
“Web.config" というファイルを作って、以下の内容を書き込みます。

$ vim Web.config
$ git add Web.config


rewrite config for FuelPHP running on Windows Azur ...

同名のファイルでややこしいのですが、今度は/publicの下に “Web.config" を作って以下の内容を書き込みます。

$ vim public/Web.config
$ git add public/Web.config


for FuelPHP public folder running on Windows Azure ...


必要なファイルの用意などは終わりました。
次はFuelPHP 自体をいじって行きましょう。

4. FuelPHP の設定をする

まずデータベースの設定から。
/fuel/app/config/production/db.php を以下のように書き換えます。

<?php
/**
 * The production database settings. These get merged with the global settings.
 */

return array(
	'default' => array(
		'connection'  => array(
			'dsn'        => 'mysql:host=<Data Source の URL>;dbname=<Database の値>',
			'username'   => '<User Id の値>',
			'password'   => '<Password の値>',
		),
	),
);

それぞれの設定すべき値は、 Azure ポータルの Web site の管理画面ダッシュボードの “View connection strings" から得る事ができます。

f:id:kikuchy:20130913231626p:plain


FuelPHP の基本設定をいじります。
/fuel/app/config/config.phpを開いて編集します。

タイムゾーン設定

FuelPHP 1.6.1 では、96, 97行目がタイムゾーンの設定箇所になります。
以下のように編集します。

	/**
	 * DateTime settings
	 *
	 * server_gmt_offset	in seconds the server offset from gmt timestamp when time() is used
	 * default_timezone		optional, if you want to change the server's default timezone
	 */
	'server_gmt_offset'  => 0,
	'default_timezone'   => "Asia/Tokyo",
Always Load の設定

使用するパッケージの設定です。ORマッパーを使うので、“ORM" パッケージの指定を行います。
FuelPHP 1.6.1 では、260行目、311行目のコメントを外し、273〜275行目のコメントも外します。

	'always_load'  => array(

		/**
		    (中略)
		 */
		'packages'  => array(
            'orm',
		),

		/**
		   (中略)
		 */
		// 'language'  => array(),
	),

/fuel/app/config/config.phpの編集はこれでおしまいです。


データベースとORマッパーの用意ができたので、 FuelPHPMVC を用意しましょう。今回は scaffold を使ってささっと作ってしまいます。
“messages" を扱う MVC を生成します。
ファイルが沢山出来上がるので、全部リポジトリに追加しておきます。
ついでにコミットもしておきます。

$ php oil generate scaffold messages title:string message:text
$ git add fuel/app/migrations/001_create_messages.php  fuel/app/classes/controller/messages.php fuel/app/classes/model/message.php fuel/app/views/messages/*.php fuel/app/views/template.php
$ git commit -a -m "initial commit"

これで使用デプロイの準備が整いました。

5. デプロイする

なかなかに長い道のりでしたが、ようやくデプロイの用意が整いました。
早速デプロイしてみましょう。

$ git push azure master

これだけです。
たまに(と言うかしょっちゅう)submodules のアップデートでエラーが起きてデプロイに失敗しますが、そんな時は Azure の Web site 管理画面の “DEPLOYMENTS" から何度かデプロイをやり直してみてください。

f:id:kikuchy:20130913233746p:plain

しつこくRETRYを繰り返すとデプロイが通ります。
というかなぜ一発で通らないのだろう…?

6. 確認

これで Azure Web site への公開が出来ました。
messages コントローラーを追加してあるので、以下のアドレスにアクセスすれば、 message の一覧を見る事ができるはずです。

http://<設定したURL>.azurewebsites.net/messages

さて、結果は…?

f:id:kikuchy:20130913235924p:plain

画面が出た! ちゃんと動いてる!
書き込みは…?

f:id:kikuchy:20130914022718p:plain

f:id:kikuchy:20130914022737p:plain


できました!!

FuelPHPWindows Azure の組み合わせでも、楽しいものが作れそうですね。
デプロイするだけで migration が出来てしまうのでとってもお手軽。データベースの設定が楽だというのは、開発する上でも工程が減るので心理的にも時間的にも助かります。


皆さんも是非、面白いものを作って公開してみてください。