HerokuのHHVMでYii2を動かす


Yii2は[hhvmでも動くんですよ](http://hhvm.h4cc.de/package/yiisoft/yii2-dev)
そしてherokuで[hhvmが動くんですよ](https://devcenter.heroku.com/articles/php-support)

というわけでせっかくですからherokuで動かしてみました。


1.まずはプロジェクトを作ります

```
php composer.phar global require "fxp/composer-asset-plugin:1.0.0-beta4"
php composer.phar create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
cd basic
git init
git add .
git commit -m "initial comit"
```

2.herokuでインスタンスを立ち上げてリポジトリに登録します

とりあえず`yii2-hoge`なんてふざけた名前でとりました。

```
git remote add heroku git@heroku.com:yii2-hoge.git
```

3.yii2の公式マニュアルのインストール方法ではグローバルにcomposer-asset-pluginをインストールしますが、herokuでは出来ないので普通にrequireの中に追加しします

```diff
diff --git a/composer.json b/composer.json
index 56756ec..b9f80ee 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,8 @@
         "php": ">=5.4.0",
         "yiisoft/yii2": "*",
         "yiisoft/yii2-bootstrap": "*",
-        "yiisoft/yii2-swiftmailer": "*"
+        "yiisoft/yii2-swiftmailer": "*",
+        "fxp/composer-asset-plugin": "1.0.0-beta4"
     },
     "require-dev": {
         "yiisoft/yii2-codeception": "*",
```

updateしてcomposer.lockを更新します

```
composer update
```

4. heroku用の設定

Procfileにhhvmとnginxを利用するための設定を書きます。最後のwebはドキュメントルートです

```Procfile
web: vendor/bin/heroku-hhvm-nginx web
```

herokuではhhvmで起動させるために、composer.jsonにhhvmの記述を追加する必要があります。

```diff
diff --git a/composer.json b/composer.json
index b9f80ee..a51b4b8 100644
--- a/composer.json
+++ b/composer.json
@@ -14,7 +14,7 @@
     },
     "minimum-stability": "dev",
     "require": {
-        "php": ">=5.4.0",
+        "hhvm": "*",
         "yiisoft/yii2": "*",
         "yiisoft/yii2-bootstrap": "*",
         "yiisoft/yii2-swiftmailer": "*",
```

本当ならココで `hhvm composer.phar update` とかしないといけないんですが、実は何もせずにこのままでもhhvmで動作します。これでhhvmをインストールするのが大変なmacで開発してherokuのhhvmで動かすことができますね！まあ、ちなみにhhvm無いと`composer update`はできなくなるんですけどね。

herokuのcomposerコマンドは`composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction`　のようになっていて、devのモジュールをロードすることはありません。なのでyii2の方でも本番用の設定をする必要があります。

標準のyii2は環境切り替えの高級な仕組み無いのでweb/index.phpを本番用にヌルリと書き換えます。

```diff
diff --git a/web/index.php b/web/index.php
index d1e070a..c5a8820 100644
--- a/web/index.php
+++ b/web/index.php
@@ -1,8 +1,8 @@
 <?php

 // comment out the following two lines when deployed to production
-defined('YII_DEBUG') or define('YII_DEBUG', true);
-defined('YII_ENV') or define('YII_ENV', 'dev');
+//defined('YII_DEBUG') or define('YII_DEBUG', true);
+defined('YII_ENV') or define('YII_ENV', 'prod');

 require(__DIR__ . '/../vendor/autoload.php');
 require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
```

5.herokuにpush

```
git add .
git commit -m "herokuで動かすためだけの悪辣な修正"
git push heroku master
```

pushしたら暫く待つだけです。終わったらアクセスしてみましょう https://yii2-hoge.herokuapp.com/

6.ほんとにhhvmで動いてるのこれ…？

なんにも変わらないですよね。不安なのでphpinfoでも見てみましょう。SiteControllerにアクションを追加します。

```diff
diff --git a/controllers/SiteController.php b/controllers/SiteController.php
index f959941..943a4bb 100644
--- a/controllers/SiteController.php
+++ b/controllers/SiteController.php
@@ -93,4 +93,9 @@ class SiteController extends Controller
     {
         return $this->render('about');
     }
+
+    public function actionInfo()
+    {
+               phpinfo();
+    }
 }
```

コミットしてpushしてアクセスしてみましょう　http://yii2-hoge.herokuapp.com/index.php?r=site%2Finfo

あ、HipHopって出ましたね！間違いなくhhvmで動いてますよ！

本当に動いただけなので実運用には一切足らないアレですが、とりあえずyii2をherokuのhhvmで動かす際に必要なことは以下の通り

* asset-pluginを追加する
* Procfileにサーバの設定を追加する
* composer.jsonのphpの設定をhhvmに置き換える
* composerが本番向けインストールなので本番設定にする