鍍金池/ 教程/ PHP/ 部署在 Heroku 云
如何以非繼承方式自定義方法
如何創(chuàng)建事件監(jiān)聽器
如何以非繼承方式擴展一個類
如何記錄消息到不同的文件
如何掌握并創(chuàng)建新的環(huán)境
如何使用 Doctrine DBAL
"XXX is deprecated" E-USER-DEPRECATED 的警告是什么意思?
在登錄表單中使用 CSRF 保護
如何注冊自定義 DQL 函數
如何為表單類配置空數據
如何嵌入集合表單
如何創(chuàng)建自定義認證提供者
如何使用 Apache Router
如何組織配置文件
部署在 Microsoft Azure 云
如何在路由參數中允許"/"字符
如何在安全,路由,服務和驗證中使用表達式
如何對顯示控制臺信息配置 Monolog
如何為一個 Bundle 創(chuàng)建友好的配置
如何改變默認的目標路徑行為
如何在運行測試之前自定義引導過程
如何從路由向控制器傳輸額外的信息
如何從數據庫(實體提供者)讀取安全用戶
如何從 Controller 調用一個命令
如何創(chuàng)建自定義表單密碼驗證器
如何使用內建的 PHP Web 服務器
如何在功能測試中用 Token 模擬認證
配置 Session 文件的保存目錄
理解前端控制器、內核及環(huán)境如何協(xié)同工作
如何實現(xiàn)一個簡單的注冊表單
如何使用 Doctrine 擴展:Timestampable, Sluggable, Translatable 等等
如何使用多個實體管理器和連接
如何自定義表單渲染
如何安裝第三方 Bundles
使用預認證安全防火墻
如何簡化多個 Bundle 的配置
會話代理實例
安裝 Composer
如何冒充一個用戶
如何注冊一個新的請求格式和 MIME 類型
如何在功能測試中使用分析器
如何在服務容器內設置外部參數
如何重寫 Symfony 默認的目錄結構
如何在一個 Symfony 控制器中創(chuàng)建一個 SOAP 的 Web 服務
如何使用序列化
部署在 Platform.sh
升級一個副版本
如何寫一個自定義的 Twig 擴展
如何在 SubVersion 中創(chuàng)建并保存一個 Symfony 項目
使用 PHP 庫聯(lián)合,編譯和最小化 Web 資產
如何創(chuàng)建一個自定義的數據收集器
如何使用和注冊命名空間路徑
如何使用 Monolog 記錄日志
如何建立一個傳統(tǒng)的登錄表單
如何強制路由總是使用 HTTPS 或者 HTTP
如何在模板中使用 PHP 而不是 Twig
如何動態(tài)選擇密碼加密算法
避免匿名用戶開始 Session 會話
如何測試 Doctrine 倉庫
如何在功能測試中測試一封電子郵件被發(fā)送
Symfony2 與 Symfony1 的區(qū)別
使用結尾反斜線重定向 URL
(configuration)如何在數據庫中使用 PdoSessionHandler 存儲 Sessions
如何使用匹配器有條件地啟用分析器
部署在 Heroku 云
如何不用自定義控制器配置重定向
如何在 Bundle 內部加載服務配置
如何處理不同的錯誤級別
如何在應用中保護服務和方法
如何對表單單元測試
如何把命令定義為服務
如何配置 Monolog 從日志中排除 404 錯誤
如何使用控制臺
如何測試與數據庫交互的代碼
如何在路由中使用除了 GET 和 POST 的 HTTP 方法
如何使用云服務發(fā)送電子郵件
如何創(chuàng)建一個控制臺命令
在遺留的應用上使用 Symfony Session
如何使用高級的訪問控制列表
如何不用一個自定義的控制器渲染一個模板
如何重寫部分 Bundle
升級一個主版本
安全訪問控制是如何工作的
如何使用 Bundle 的繼承來重寫部分 Bundle
如何使用 Voter 檢查用戶權限
如何為多個 Doctrine 的實現(xiàn)提供模型類
如何使用作用域
如何部署一個 Symfony 應用
如何用 "inherit-data" 減少代碼冗余
如何注冊事件監(jiān)聽器和訂閱
使用 Bower 安裝 Symfony
如何創(chuàng)建一個自定義路由加載器
如何創(chuàng)建一個自定義的驗證限制
在獨立注入類中使用參數
如何使用 Assetic 和 Twig Functions 進行圖像優(yōu)化
如何利用表單事件動態(tài)修改表單
如何在過濾器的前后設置事件分發(fā)器
如何在 Bundle 中使用 Compiler Passes
緩存包含 CSRF 保護表單的頁面
如何注入變量到所有的模板(如全局變量)
如何創(chuàng)建一個自定義表單域類型
如何限定防火墻使其只允許通過指定請求
如何把 Controller 定義為服務
如何使用 Gmail 發(fā)送郵件
升級一個補丁版本
如何創(chuàng)建一個表單類型擴展
如何對不同的 URL 強制使用 HTTPS 或者 HTTP
如何使用 Varnish 加速我的 Web 站點
如何定義虛擬類和接口之間的關系
如何自定義登錄表單
如何測試多個客戶端的交互
PSR-7 Bridge
如何使用 YUI Compressor 裁剪 Javascripts 和 Stylesheets
在用戶的 Session 中使用局部 "Sticky"
如何定制錯誤頁
如何從已存在的數據庫中生成實體
如何用 Doctrine 上傳文件
可復用 Bundles 的最佳實踐
如何發(fā)送一封電子郵件
如何將 Assetic Filter 應用到具體的文件擴展名上
切換分析器存儲
如何上傳文件
限制 Session 元數據的寫入
如何使用多用戶提供者
如何使用數據轉換
配置一個 Web 服務器
如何編程訪問分析器數據
如何在路由中使用服務容器參數
如何在控制臺生成 URL 和發(fā)送郵件
如何將你的開發(fā)環(huán)境優(yōu)化為調試環(huán)境
如何在控制臺命令中啟用日志
如何在功能測試中模擬 HTTP 認證
如何使用 API 驗證用戶
如何移除 AcmeDemoBundle
控制臺命令
如何配置 Symfony 使其工作在負載均衡和反轉代理
如何添加“記住我”登錄功能
如何使用 Assetic 進行資產管理
如何限定防火墻使其接受指定主機
如何使用訪問控制列表(ACLs)
如何裁剪 CSS/JS 文件(使用 UglifyJS 和 UglifyCSS)
如何緩存電子郵件
如何使用 submit() 函數處理表單提交
如何在 Git 中創(chuàng)建并保存一個 Symfony 項目
如何創(chuàng)建自定義用戶提供者
如何對電子郵件錯誤配置 Monolog
如何在開發(fā)時使用電子郵件

部署在 Heroku 云

這本按部就班的教程描述了如何在 Heroku 云平臺上部署一個 Symfony 網頁應用程序。其內容基于在 Heroku 上出版的原創(chuàng)文章。

設置

創(chuàng)建一個新的 Heroku 網站,首先用 Heroku 注冊或者用您自己的證書注冊。然后在您的本地計算機上下載并安裝 Heroku Toolbelt。

您也可以查看在 Heroku 上開始使用 PHP 的指導來獲取更多的對于在 Heroku 上使用 PHP 應用程序的細節(jié)的熟悉度。

準備您的應用程序

在 Heroku 上部署一個 Symfony 應用程序不需要其代碼的任何變化,但是需要對其配置的一些輕微調整。

默認情況下,Symfony 應用程序會登錄進入您應用程序的 app/log/ 目錄。這不是很理想的因為 Heroku 使用的是短暫的文件系統(tǒng)。在 Heroku 中,處理登錄的最好方法是使用 Logplex。并且發(fā)送登錄數據到 Logplex 最好的方式是通過編寫 STDERR 或者 STDOUT。幸運的是,Symfony 使用的是非常好的 Monolog 庫來登錄。因此,一個新的日志目的就是僅僅改變一個配置文件。

打開 app/config/config_prod.yml 文件,把 monolog/handlers/nested 片段(若還未存在就創(chuàng)建一個)并改變 path 的值,從 "%kernel.logs_dir%/%kernel.environment%.log""php://stderr"

# app/config/config_prod.yml
monolog:
    # ...
    handlers:
        # ...
        nested:
            # ...
            path: "php://stderr"

一旦應用程序被部署,運行 heroku logs –tail 使 Heroku 中的日志流在您的終端保持開啟狀態(tài)。

在 Heroku 中創(chuàng)建一個新的應用程序

創(chuàng)建一個您可以啟動的新的 Heroku 應用程序,使用 CLI create 命令:

$ heroku create

Creating mighty-hamlet-1981 in organization heroku... done, stack is cedar
http://mighty-hamlet-1981.herokuapp.com/ | git@heroku.com:mighty-hamlet-1981.git
Git remote heroku added

現(xiàn)在您已經準備好部署應用程序,如同在下一個部分解釋的那樣。

在 Heroku 上部署您的應用程序

在您的首次部署前,您僅需要再做三件事,解釋如下:

1.創(chuàng)建一個 Procfile

2.設置環(huán)境 prod

3.啟動 Heroku 的代碼

1)創(chuàng)建一個 Procfile

默認情況下,Heroku 會開啟一個 Apache 網頁服務器和 PHP 一并來服務應用程序。然而,有兩個特殊情況適用于 Symfony 應用程序:

1.文件根是在 web/ 目錄中,而不是在用應用程序的根目錄中。

2.Composer bin-dir,即供應商的二進制文件(Heroku 自身的引導腳本)放置的地方,是 bin/,不是默認的 vendor/bin。

供應商的二進制文件一般由 Composer 安裝在 vendor/bin,但是有些時候(例如:當運行一個 Symfony 標準版本項目?。?,定位是不同的。如果有疑問的話,您可以運行 composer config bin-dir 來找出正確的位置。

在應用程序的根目錄創(chuàng)建一個新的文件叫做 Procfile(沒有任何擴展),并且僅添加以下內容:

b: bin/heroku-php-apache2 web/

如果您更喜歡使用 Nginx,在 Heroku 同樣是可以使用的,您可以創(chuàng)建一個配置文件或者按照在 Heroku documentation 描述的那樣從 Procfile 指向它:

web: bin/heroku-php-nginx -C nginx_app.conf web/

如果您更喜歡使用命令控制臺工作,執(zhí)行以下命令來創(chuàng)建 Procfile 文件,并且將其添加到存儲庫中:

$ echo "web: bin/heroku-php-apache2 web/" > Procfile
$ git add .
$ git commit -m "Procfile for Apache and PHP"
[master 35075db] Procfile for Apache and PHP
 1 file changed, 1 insertion(+)

2) 設置環(huán)境 prod

在部署中,Heroku 運行 composer install --no-dev 來安裝應用程序所需要的所有依賴。然而,一般在 composer.json 安裝后命令,例如:安裝資產或者清除(或預熱)緩存,在默認情況下運行使用 Symfony 的 dev 環(huán)境。

這明顯不是您想要的—應用程序在“生成”中運行(盡管您只是用它來做個試驗,或者作為一個過渡環(huán)境),所以任何構建的步驟也應該使用同樣的 prod 環(huán)境。

幸好這個問題的解決方案是很簡單的:Symfony 將會選擇一個環(huán)境變量稱 SYMFONY_ENV 并且如果沒有其他特別的設置就會使用此環(huán)境。當 Heroku 公開所有配置變量作為環(huán)境變量,您可以發(fā)出一個單獨命令來為您的應用程序做部署的準備:

$ heroku config:set SYMFONY_ENV=prod

注意在 require-dev 區(qū)段 composer.json 列出的依賴在 Heroku 中部署的過程中從不被安裝。如果您的 Symfony 環(huán)境依賴這些包的話可能會引發(fā)問題。解決方案就是從 require-dev 移除這些包到 require 區(qū)段。

3)啟動 Heroku 的代碼

下一步,終于到了在 Heroku 部署您的應用程序的時間。如果您是第一次做這個的話,您將會看到像如下的信息:

The authenticity of host 'heroku.com (50.19.85.132)' can't be established.
RSA key fingerprint is 8b:48:5e:67:0e:c9:16:47:32:f2:87:0c:1f:c8:60:ad.
Are you sure you want to continue connecting (yes/no)?

這個情況下,您需要通過輸入 yes 并點擊 按鍵來確認—理想的情況是您驗證了 RSA 秘鑰指紋是正確的

然后,執(zhí)行這個命令部署您的應用程序:

$ git push heroku master

Initializing repository, done.
Counting objects: 130, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (107/107), done.
Writing objects: 100% (130/130), 70.88 KiB | 0 bytes/s, done.
Total 130 (delta 17), reused 0 (delta 0)

-----> PHP app detected

-----> Setting up runtime environment...
       - PHP 5.5.12
       - Apache 2.4.9
       - Nginx 1.4.6

-----> Installing PHP extensions:
       - opcache (automatic; bundled, using 'ext-opcache.ini')

-----> Installing dependencies...
       Composer version 64ac32fca9e64eb38e50abfadc6eb6f2d0470039 2014-05-24 20:57:50
       Loading composer repositories with package information
       Installing dependencies from lock file
         - ...

       Generating optimized autoload files
       Creating the "app/config/parameters.yml" file
       Clearing the cache for the dev environment with debug true
       Installing assets using the hard copy option
       Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework
       Installing assets for Acme\DemoBundle into web/bundles/acmedemo
       Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution

-----> Building runtime environment...

-----> Discovering process types
       Procfile declares types -> web

-----> Compressing... done, 61.5MB

-----> Launching... done, v3
       http://mighty-hamlet-1981.herokuapp.com/ deployed to Heroku

To git@heroku.com:mighty-hamlet-1981.git
 * [new branch]      master -> master

就是這樣!如果您現(xiàn)在打開您的瀏覽器,要不就手動指向 heroku create 給您的 URL,或者也可以使用 Heroku Toolbelt,應用程序將會響應:

$ heroku open
Opening mighty-hamlet-1981... done

您應該在您的瀏覽器中看到 Symfony 應用程序。

如果您第一步在 Heroku 上安裝全新的 Symfony 標準版本,您或許會遇到一個 404 頁面沒有找到錯誤。這是因為 / 的路徑是由 AcmeDemoBundle 定義的,但是 AcmeDemoBundle 只在 dev 環(huán)境中加載(查看您的 AppKernel 類)。嘗試從 AppBundle 打開 /app/example。

自定義編譯步驟

如果您想在創(chuàng)建過程中執(zhí)行另外的自定義命令,您可以利用 Heroku 的自定義編譯步驟。想象您為了避免潛在的易損性想從 Heroku 中的產出環(huán)境移除 dev 前端控件。添加一個命令來移除 web/app_dev.php,Composer 的安裝后命令就會工作,但是它也會分別地移除本地 composer installcomposer update 開發(fā)環(huán)境中的控件。相反,您可以在您的 composer.jsonscripts 區(qū)段里添加一個自定義 Composer 命令叫做 compile (這個關鍵的名字是 Heroku 慣例)。列出的命令鉤掛到 Heroku 的部署過程:

{
    "scripts": {
        "compile": [
            "rm web/app_dev.php"
        ]
    }
}

對于在產出系統(tǒng)中創(chuàng)建資產也是很有用的,例如:用 Assetic:

{
    "scripts": {
        "compile": [
            "app/console assetic:dump"
        ]
    }
}

Node.js 依賴

構建資產可能取決于節(jié)點包,例如 uglifyjsuglifycss 資產縮小。在部署過程中安裝節(jié)點包需要節(jié)點的安裝。但是現(xiàn)在,Heroku 使用 PHP 構建包編譯您的應用程序,是由 composer.json 文件的存在而自動偵測,不包括節(jié)點安裝。因為 Node.js 構建包比 PHP 構建包(參見 Heroku 構建包)更優(yōu)先,添加 package.json 列出您的節(jié)點依賴從而使 Heroku 選擇 Node.js 構建包:

{
    "name": "myApp",
    "engines": {
        "node": "0.12.x"
    },
    "dependencies": {
        "uglifycss": "*",
        "uglify-js": "*"
    }
}

根據下一次部署,Heroku 使用 Node.js 構建包來編譯應用程序并且安裝您的 npm 包。另一方面,composer.json 現(xiàn)在被忽略。用兩個構建包,Node.js PHP 編譯您的應用程序的話,您可以使用一個特殊的多樣構建。為了覆蓋構建包自動偵測,您需要明確地設置構建包 URL:

$ heroku buildpacks:set https://github.com/ddollar/heroku-buildpack-multi.git

接下來,添加 .buildpacks 文件到您的項目中,列出您所需要的構建包:

ttps://github.com/heroku/heroku-buildpack-nodejs.git
https://github.com/heroku/heroku-buildpack-php.git

有了下一次部署,您可以從兩個構建包獲益。此設置也啟動您的 Heroku 環(huán)境,充分使用像 Grunt 或者 gulp 這些基于自動構建工具的結點。