FuelPHP を GoogleAppEngine for PHP (gae)で動かしてみました。
※2013/10/14 ひとまずデプロイして動作するようになったので記事を更新しました。
※2013/10/16 log出力パッチを公開しました。
環境
GoogleAppEngineLauncher(GAEの開発環境)が Webサーバも兼ねているので Apache は不要です。
- OSX 10.8.5
- GoogleAppEngineLauncher 1.8.5
- PHP 5.4.20
- FuelPHP 1.6
まずは環境定義をします
GAE にデプロイすると当然 URL がローカルとは異なりますので、とりあえずローカルとデプロイ先で環境を切り替えるように定義しておきます。ここではローカルを "development" デプロイ先を "production" とします。Fuel はサーバ変数 "FUEL_ENV" の値で切り替えられます。GAE の場合は app.yaml で定義可能です。
env_variables:
FUEL_ENV: 'production'
# FUEL_ENV: 'development'
app.yaml でリクエストをハンドルする
FuelPHP は全てのリクエストを /public/index.php に処理させる仕組みとなっているので、/public/assets 配下へのアクセスは静的ファイルとしてアクセスさせる必要があります。
そのハンドリングを標準では Apache の .htaccess で行いますが Google App Engine では、それをアプリケーション設定ファイルである app.yaml の handlers で指定してあげます。同様に favicon.ico についても静的ファイルとして設定します。
handlers:
# assets dir
- url: /assets
static_dir: public/assets
# favicon file
- url: /favicon.ico
static_files: favicon.ico
upload: favicon.ico
# php files
- url: /.*
script: public/index.php
ローカル環境ではこれだけで動いてくれるのですが、GAE に上げると色々あり、以降の設定が必要です。
![localでの起動画面 localでの起動画面](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgklj94EPbgGllXxFqAuXDvxS07zlnDmshHGg5UGgpfndbdXR2nMpp-UwcK8JnJqoIWHTApOLddgtc6SF43F8SQopbqrLUqRK18IFulNbZVtuZ3rNr0Rr-15RzFcMjq5KKIPD58WJ74dNeA/s400/fuelphp_hello.png) |
ローカルでは動くのですが。。。 |
base_url を設定する
GAE に上げた際の URL を定義します。production 環境でのみ有効となるように、production 用の設定ファイルである下記ファイルへ定義します。必要な項目のみ差分で定義できます。
/fuel/app/config/production/config.php
'base_url' => 'http://{your_app_id}.appspot.com/',
logファイルは出力できないのでパッチを作りました
GAE 上ではlogファイルの出力は行えませんので、下記設定で出力しないようにすることで回避は可能です。
/fuel/app/config/production/config.php
'log_threshold' => Fuel::L_NONE,
ただ、これでは実用的ではありませんので Fuel の Logクラスを改修して、GAE でログ出力を行うためのパッチを作成しました。単純に /fuel/core/classes/log.php のファイル出力部分を syslog() に置き換えただけです。GitHub に公開しましたので自由に使ってください。
https://github.com/isatan/FuelPHP4Gae_patch
/fuel/core/classes/log.php を置き換えるだけで下記のように GAE のコンソールに出力されるようになります。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjggC_e0fo0QC_u721ZGox8v6zsKLV53DwwHZYRhvTmd2ISbNJUBsbKaJ0melfH5ELfCy0_vdpacqg6Y_xQXbMfpHjDEMvpW_I6_6YDXQNB6faqOiIpNdGX1HPCU4LtZEH6BjTL_1lSojkw/s640/disable_log.png) |
log をファイル出力すると 500 エラーにもかかわらず何も出力されません。 |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdYow3Bnef_ARtj4XZj2oVbRnwxSzeDL-Yo2jQAhH8r_dbMOI3LHfnWxNevthPah3zz4wqoCgENralBwG07INcpOdLlnSnIWiZ68GGyxTEmYgCQ0GDS3OQMApSurLa4TT2m2f4KA5VM9hN/s640/enable_log.png) |
パッチをあててもらうと Fuel の log 出力も debug log も出力できます。 |
locale を指定する
Fuel のデフォルト locale は "en_US" ですが、GAE では指定できないようです。いくつか試したところ、Cロケールは認識してくれました。
/fuel/app/config/production/config.php
'locale' => 'C',
assets 関連ファイルは絶対 URL で指定する
どういうわけか、base_url を指定しているのもかかわらず assetes 関連のファイルを見つけてくれず、bootstrap.css の読み込みでエラーになってしまいます。assets 用の設定ファイルに下記の設定することでエラー時に強制実行させることができますが、それでは link タグを出力してくれません。
/fuel/app/config/production/asset.php
'fail_silently' => true,
仕方がないので view ファイルでの assets 関連ファイルの指定は絶対 URL で指定することにします。
/fuel/app/views/welcome/index.php
echo Asset::css('http://{your app id}.appspot.com/assets/css/bootstrap.css');
動きました
これで FuelPHP の welcome 画面は表示できるようになりました。ここで修正した app.yaml, config.php, log.php は GitHub に上げてありますので自由に使ってください。
https://github.com/isatan/FuelPHP4Gae_patch
ただ、assets ファイルの指定はいただけないので今後なんとかしたいですね。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbsyPK70u470BKg1gslw4Je1JtmjzAzRepnXAJzx6NyPayrcgg9I6SXvCwf-T_SmVcToBaSaxhR6vHcAdOq7YH8s5wDcg8Jq2BhgSfkxhE69GpxVNIzTUCLXarfhGxlllbwtrucSkWXwCr/s400/welcome.png) |
ようやく appspot.com 上でも Welcome! が拝めました。 |