こんにちは!「Symfony Advent Calendar JP 2011」
13日目です。
昨日の @77webさんからバトンタッチで、今日は「PHPFog + Symfony2 でステージング環境を作る方法」をワタクシ、バコラー (@bakorer) がご紹介します。

PHPFog と Symfony2 って何?
さて、今日のブログのテーマですが、タイトル通り PHPFog に Symfony2 が動作する環境を作る手順をめっちゃ丁寧に書いていきたいと思います。
みんな大好き Symfony については説明するまでもありません、PHP5向けのウェブアプリケーションフレームワークです。
・公式:High Performance PHP Framework for Web Development – Symfony 
「PHP fog」はPHPの実行環境を提供しているPaaS型クラウドです。先日、3つのアプリケーションまで永久無料にすると発表されたPHPerに優しいサービスなのです。
・詳しくはこちらの記事を参考:ずっと無料で使えるPaaS型クラウドのまとめ。2011年版 - Publickey 
・公式:PHP Fog — Rock Solid Cloud Platform for PHP 
Heroku を使うとステージング環境がカンタンに作れて素敵だったから、Symfony2 用のステージング環境をサクッと作りたかったんだ。
ところで、皆さんステージング環境ってどうされていますか?
- ステージング用の VPS を契約してる
- 開発環境で確認したら、即、本番アップだぜ!
- ステージング環境なにそれ?おいしいの?
色々とあると思います。
僕は少し前から、Heroku + Ruby on Rails でも開発しているのですが、本番環境だけでなくステージング環境も簡単に作れることに感動しておりました。
じゃあ、Symfony2 でもPaas使えばできるんじゃない?
ということでやってみました。
(Heroku + Rails でステージング環境を作りたいって方はこちらの記事もどうぞ)
・参考:Heroku + Rails の認証付きステージング(staging)環境を構築する方法 | CodeNote.net 
最初は、Heroku で最近 PHP も使えるようになったし、Herokuで作るか!と思ったけど無理でした
あまり知られていないようですが、少し前からHerokuでもPHPが動作するようになりました。
なので、使い慣れた Heroku でやってみよう!と思い Try しましたが、Symfony2 の動作環境としては以下の通り無理でした。

・http://symfony2.herokuapp.com/
Symfony2 なんだし PHP Fog を使ってみよう!
Heroku が使えないので、他の Paas を検討することに。
Symfony2 は PHP製のフレームワークですし、お寿司。
PHP Fog を使ってみよう!
ということで、名前に惹かれて PHP Fog に決定。
他の候補は、fluxflex
とかも日本人がやってて、かなり良さそうだったけどまた別の機会に。
PHP Fog + Symfony2 でステージング環境を作る手順
さて、やっと手順です。
- PHP Fog で新規アプリ作成
- Symfony2 アプリケーションを PHP Fog に Pushする
- PHP Fog App を Symfony2 用に設定する
- Symfony2 に Basic認証を設定する
ここから飛ばしていきます!
1. PHP Fog で新規アプリ作成
まず、PHP Fog で新しくアプリケーションを作成します。

次に、アプリケーション選択の画面で、「Custom App」をクリックします。
(Cake、Zend、CodeIgniterとかあるのにSymfonyがないじゃないか!)

”MySQLのパスワード”と”ドメインの設定”をします。
独自ドメインを使わない場合は、phpfogapp.com のサブドメインが使えます。

PHP Fog 上でのアプリ作成完了です。

最後に、SSH公開鍵の設定をします。

2. Symfony2 アプリケーションを PHP Fog に Pushする
PHP Fog上にアプリを作って、次はいよいよ Symfony2 アプリケーションを設置します。
まず、git clone で PHP Fog からローカルにリポジトリを複製して、初期ファイルを削除します。
$ git clone git@git01.phpfog.com:symfony2.phpfogapp.com
Cloning into symfony2.phpfogapp.com...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd symfony2.phpfogapp.com
$ git rm index.php |
$ git clone git@git01.phpfog.com:symfony2.phpfogapp.com
Cloning into symfony2.phpfogapp.com...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd symfony2.phpfogapp.com
$ git rm index.php
また、新しいリモート Git リポジトリにアクセスしやすいように phpfog という名前をつけて追加します。
$ git remote add phpfog git@git01.phpfog.com:symfony2.phpfogapp.com |
$ git remote add phpfog git@git01.phpfog.com:symfony2.phpfogapp.com
次に、Symfony2 のファイル一式を設置して、app_dev.php, config.php を編集して、IPアクセス制限の部分をコメントします。
$ vim web/app_dev.php
$ vim web/config.php |
$ vim web/app_dev.php
$ vim web/config.php
・参考:Symfony2 ドキュメント日本語版 | Symfony2日本語ドキュメント 
編集したら、PHP Fog 上に Symfony2 アプリを設置します。
$ git add .
$ git commit -m 'symfony2 init'
$ git push phpfog master
Counting objects: 3975, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3781/3781), done.
Writing objects: 100% (3974/3974), 3.75 MiB | 290 KiB/s, done.
Total 3974 (delta 1060), reused 0 (delta 0)
remote: -----> Deploying to the cloud
To git@git01.phpfog.com:symfony2.phpfogapp.com
5708d64..adab3a0 master -> master |
$ git add .
$ git commit -m 'symfony2 init'
$ git push phpfog master
Counting objects: 3975, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3781/3781), done.
Writing objects: 100% (3974/3974), 3.75 MiB | 290 KiB/s, done.
Total 3974 (delta 1060), reused 0 (delta 0)
remote: -----> Deploying to the cloud
To git@git01.phpfog.com:symfony2.phpfogapp.com
5708d64..adab3a0 master -> master
Symfony2 の動作環境を /config.php から確認します。

タイムゾーンの設定を app/AppKernel.php に書きます。
ini_set('date.timezone', 'Asia/Tokyo'); |
ini_set('date.timezone', 'Asia/Tokyo');
PHP アクセラレータはインストールできないのでスルーします。
同様に、short_open_tag の設定も変更できないのでスルー。
3. PHP Fog App を Symfony2 用に設定する
PHP Fog では console からコマンドを叩くことができないので、cache:clear などのコマンドをWebアプリ経由で実行できるようにする必要があります。
$ vim web/clean_prod_cache.php |
$ vim web/clean_prod_cache.php
<?php
system('php ../app/console env=prod cache:clear');
system('php ../app/console env=prod cache:warm');
?> |
<?php
system('php ../app/console env=prod cache:clear');
system('php ../app/console env=prod cache:warm');
?>
また、ドキュメントルートの設定もしておきます。

これにより、http://symfony2.phpfogapp.com/web/app_dev.php/ というURLが
http://symfony2.phpfogapp.com/app_dev.php/
と web を省略できるので、やっておきましょう。
最後に、cache, logs ディレクトリに書込み権限を与えておきます。

Symfony2 に Basic認証を設定する
ステージング環境ということで、Basic認証ぐらいは設定しておきたいですよね。
security.yml にサクッと書いてしまいましょう。
$ vim app/config/security.yml |
$ vim app/config/security.yml
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
providers:
in_memory:
users:
admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
firewalls:
secured_area:
pattern: ^/
http_basic:
realm: "Secured Area"
access_control:
- { path: ^/, roles: ROLE_ADMIN } |
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
providers:
in_memory:
users:
admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
firewalls:
secured_area:
pattern: ^/
http_basic:
realm: "Secured Area"
access_control:
- { path: ^/, roles: ROLE_ADMIN }
ここまでで作ったアプリは下記のリンクから ID: admin / PASS: adminpass でアクセスできます。
http://symfony2.phpfogapp.com/app_dev.php/
以上です。
MVCのどれも全く作ってないのでアレな感じはしますが、とりあえず今日はここまでということで。
「Symfony2のステージング環境ならこれがオススメ!」というのがあれば是非、Twitterやブコメでアドバイス頂ければ嬉しいです。
他の言語でも、「ステージング環境はこうしてるよ!」というアドバイスも絶賛募集中でございます。
ちなみに本記事は、先日開催された「第5回 Symfony2 勉強会」のLTで発表したネタを書き起こしたものです。
・参考:人生初のLTを第5回 Symfony2 勉強会でしてきました [ #Symfony2study] – バコラー日記 ![はてなブックマーク - 人生初のLTを第5回 Symfony2 勉強会でしてきました [ #Symfony2study] - バコラー日記](http://b.hatena.ne.jp/entry/image/http://blog.livedoor.jp/bakorer/archives/50641480.html)
次回予告
さて、明日、2011/12/14(水)は@ganchiku
こと、大野さんです。
・大野さんのプロフィールページ:GANCHIKU.com 
きっと、めっちゃためになる内容だと思うので乞うご期待です!
—-
参考文献
・PHP Fog – Supported Frameworks 
・Using Symfony2 on PhpFog now. – Developly 
・Assetの管理にどうやってAsseticを使うか? | Symfony2日本語ドキュメント 
・セキュリティ | Symfony2日本語ドキュメント 
・Symfony2の認証を色々試してみる(前編) – 覇王色を求めて 