Using Laravel and HHVM on Heroku

會寫這篇是前一陣子 HHVM 突然又被大家撈起來討論,看起來應該是有啥新進化吧 XD
那時身為專業的阿宅,一定要馬上裝來玩一下。

隨著時間的流逝,又有人發現用 HHVM 可以讓 Composer 跑更快一點(超自然啊!)
我又再次回想起這神奇的東西⋯⋯
現實是 Composer 跑太慢被 HHVM 斷開魂結

當時我就想,既然我都搞了 Phalcon on Heroku 這東西,不如再來搞一個 HHVM 版本吧!

沒想到官方竟然無情的已經做好了,於是我只好轉戰 Laravel 然後冒險就這樣開始了(才沒有 XD

PaaS 入門指南還沒斷,不過人生總是需要調味一下,就先讓我寫些別的吧 XD

其實這有雷,但是沒有被雷打過(原來不是地雷)怎麼知道什麼叫做「痲痹」的感覺呢?
所以,請大家跟我一起來「被雷劈~」一下吧!
好吧,你要跳過我不介意,不過不要恨我把前置動作寫在過程喔(揪咪

初始化 Laravel 專案

根據官方公佈的新手預置技能使用指南只要執行以下動作即可。

composer create-project laravel/laravel your-project-name –prefer-dist

1: your-project-name 就是專案名稱,應該不會有人打錯吧 XD
2: 沒用過 composer 嗎?這裡不是新手區,趕快去學這個技能吧!

生成 Heroku 力場

git init

這是基礎技能,可以參考一下 PaaS 入門指南(二)的相關說明

Heroku create –buildpack https://Github.com/hhvm/heroku-buildpack-hhvm

註:如果不希望 APP 名稱是隨機的,可以在 create 後面加上名稱喔~

最後使用黑暗魔法 - HHVM 設定檔
適用于 Heroku 的版本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Server {
SourceRoot = /app/public/
}
VirtualHost {
* {
Pattern = .*
RewriteRules {
* {
pattern = .?
# app bootstrap
to = index.PHP
# append the original query string
qsa = true
}
}
}
}
StaticFile {
Extensions {
CSS = text/css
gif = image/gif
html = text/html
jpe = image/jpeg
jpeg = image/jpeg
jpg = image/jpeg
png = image/png
tif = image/tiff
tiff = image/tiff
txt = text/plain
}
}

其實就是刪掉 Port 設定,因為 Heroku 會幫你指定這樣。
註:Extensions 可以自行追加,其實他有少一些項目 XD

自爆吧!

git push Heroku master

沒錯,現在你會看到網站順利地跑起來了!
哪裡有雷?給我出來面對!

看清楚你的 Terminal 啊!是不是 post- 或者 pre- 這類跑完 composer install 該跑的 Script 都死了⋯⋯
「因為找不到 PHP」

不過,即使你改為 hhvm artisan 也是不會動的噢~
不然怎麼會是雷,而且這樣其實本機跑也很不方便啊!

黑魔法!

現在,打開 composer.json 然後把 PHP 改為 $_ 就對了!
如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
true"name": "laravel/laravel",
true"description": "The Laravel Framework.",
true"keywords": ["framework", "laravel"],
true"license": "MIT",
true"require": {
truetrue"laravel/framework": "4.1.*"
true},
true"autoload": {
truetrue"classmap": [
truetruetrue"app/commands",
truetruetrue"app/controllers",
truetruetrue"app/models",
truetruetrue"app/database/migrations",
truetruetrue"app/database/seeds",
truetruetrue"app/tests/TestCase.PHP"
truetrue]
true},
true"scripts": {
truetrue"post-install-cmd": [
truetruetrue"$_ artisan clear-compiled",
truetruetrue"$_ artisan optimize"
truetrue],
truetrue"post-update-cmd": [
truetruetrue"$_ artisan clear-compiled",
truetruetrue"$_ artisan optimize"
truetrue],
truetrue"post-create-project-cmd": [
truetruetrue"$_ artisan key:generate"
truetrue]
true},
true"config": {
truetrue"preferred-install": "dist"
true},
true"minimum-stability": "stable"
}

git push Heroku master

當你再次 push 上去時,一切就正常了!世界再次回歸秩序啊!!!

註:本機建議在 ~/.bashrc 之類的補上 alias composer="PHP /bin/usr/local/composer" 之類的,不然本機會跑失敗喔!

所以,到底發生了什麼?

原來這個問題只要是 Heroku 的 PHP Buildpack 都會碰到,然後就有歪國人西方高人找到了方法

沒錯,就是 $_ 這個魔法般的祕技⋯⋯

那麼,鏡頭轉到 bash 的說明書上:
http://www.gnu.org/software/bash/manual/bashref.html

When Bash invokes an external command, the variable ‘$_’ is set to the full path name of the command and passed to that command in its environment.)

簡單來說 $_ 基本上跟 $! 算是好兄弟之類的,效果都是「上一次執行的 XXX」這樣的感覺。
$_ 是「上一次執行的指令」然後在這個運用中,就很神奇的可以取得 HHVM 的執行指令(超神奇的!)然後就順利地將 Composer 的 Script 都跑起來了!

喔耶,總之就這樣寫完了 XD

因為上課時間關係,週二更新不方便,以後應該是週日或者週一更新網誌喔~
(不過我可能偷懶,還是訂閱 RSS 比較方便 XD)

留言