silex.pharでなくcomposerで管理するようになった版のSilexで動くwebアプリを国産PaaSのphper.jpで動かすことに成功したので、設定などをメモを兼ねて書いておきたいと思います。
phper.jpは面倒なサーバー構築不要でphp実行環境を使うことができる素敵なサービスですv
アプリサーバーの設定
ドキュメントルートはプロジェクトルート=ドキュメントルートの時は空文字列のままでOKのようです。
アプリサーバー設定直後は503になるようです。もしアプリサーバーを設定してしばらく経っても503のままの時は、何も変更せず再度設定の保存をすると表示できるようになるというレポがありました。
アプリサーバーを設定しても、設定保存し直してもずーっと503の時、エラーログにNo route to hostというエラーが出ていたら、何をやっても無駄なのでプロジェクトを作成し直したほうが良いです…。←私はこれで丸一日はまりました
vendorライブラリのインストール(composer.phar install)をアプリサーバー側で実行させる
通常、composerを使ったSilexのプロジェクトをどこかのサーバーにリリースする場合、サーバー側でcomposer.phar installを実行してvendorライブラリを入れますよね。しかし、phper.jpのアプリサーバーには、VPSや専用サーバーと違い自力でSSH接続をすることはできません。
かといって、vendorライブラリを全部gitの管理下に置いてpush→デプロイはちょっと面倒です。(まぁ、ほかに手段が無ければやっても良いのですが)
そこで、phper.jpのデプロイ時スクリプトを利用します。
http://phper.jp/manual#deploy
.phper/deployはデプロイごと(=pushごと)なのでcomposer.phar installの実行タイミングとしては多すぎる気もします。(「別に多すぎる気がしない」という方はそのまま.phper/deployに書いてよいと思います)
私はrequireを足したとき、主要なライブラリがアップデートされたときに手動で実行したいと思ったので、少々用途が違う気もしつつ.phper/initdbに書きました。(後述するようにrsync_exclude.txtがうまく効かなかったので、結局deployに書き直したのですが)
mod_rewriteを効かせる
UrlGeneratorServiceProviderを使って生成される内部URLは基本的にmod_rewriteが前提ですね。(index.php付きでアクセスした場合は別ですが)
つまり、UrlGeneratorServiceProviderを使う場合はmod_rewriteが必要になります。
apacheの設定は.phper/httpd.confに書けば効きますと書いてあるのですが
http://phper.jp/manual#deploy
.phper/httpd.confにmod_rewrite設定を書いてpush→デプロイしてもmod_rewriteは有効になりませんでした。(先にアプリサーバー追加した状態で後からhttpd.confを足したからかも?)
ダメもとでドキュメントルートに.htaccessを置いたところ正常に動作。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
composerでインストールしたvendorライブラリがデプロイ時に消えないようにする
push時のデプロイはrsyncが--deleteオプション付きで実行されるようなので、.phper/rsync_exclude.txtを置いてvendorライブラリ群を除外します。
http://phper.jp/manual#deploy
※私の書き方が悪いのか公式のドキュメントが古いのか不明ですが、.phper/rsync_exclude.txtで除外したつもりのvendorライブラリがデプロイごとに削除されてしまうため、composer.phar installをデータベース初期化時スクリプトからデプロイ時スクリプトに書き直しました。
proxy設定する
proxyが動作するようなのでSilexの公式ドキュメントにある通り、proxyをtrustするようにSilex側の設定をします。
http://silex.sensiolabs.org/doc/usage.html#bootstrap
"If your application is hosted behind a reverse proxy and you want Silex to trust the X-Forwarded-For* headers, you will need to run your application like this:"
Request::trustProxyData();
$app->run();