如何部署Symfony程序
部署Symfony可能是一個(gè)復(fù)雜和多樣的任務(wù),取決于你的程序的設(shè)置和需求。本文并非手把手的指南,而是羅列了部署時(shí)的常見(jiàn)需求和建議。
Symfony部署基礎(chǔ) ?
發(fā)生在部署Symfony時(shí)的典型步驟包括:
- 把你的代碼上傳到產(chǎn)品服務(wù)器;
- 安裝三方依賴(lài) (通常透過(guò)Composer完成,并且可以在上傳程序之前完成);
- 運(yùn)行數(shù)據(jù)庫(kù)遷移(migration)或類(lèi)似任務(wù),以更新“已改變的”數(shù)據(jù)結(jié)構(gòu);
- 清除 (可選地,預(yù)熱[warming up]) 你的緩存。
部署過(guò)程還包括其他任務(wù),諸如:
- 對(duì)代碼的某個(gè)特定版本打上標(biāo)簽,作為你的版本寶庫(kù)中的一個(gè)發(fā)布;
- 創(chuàng)建一個(gè)臨時(shí)區(qū)域,以構(gòu)建你的 "offline" 離線(xiàn)已更新設(shè)置;
- 運(yùn)行任意可用測(cè)試,以確保代碼和/或服務(wù)器的穩(wěn)定性;
- 從
web/
目錄刪除任何不必要的文件以保持生產(chǎn)環(huán)境干凈; - 清除外部緩存系統(tǒng) (像是 Memcached 或 Redis)。
如何部署Symfony程序 ?
部署Symfony程序時(shí)有幾種方式。始于一些基本的部署策略,然后從那里開(kāi)始。
基本文件傳輸 ?
部署一套程序最基本的方式是通過(guò)FTP/SCP(或類(lèi)似方法)手動(dòng)拷貝文件。其欠點(diǎn)是,比如在升級(jí)過(guò)程中,你缺少對(duì)系統(tǒng)的控制。這種方法也需要你在文傳輸之后執(zhí)行一些手動(dòng)步驟(參考 常見(jiàn)的后部署任務(wù))。
使用版本控制 ?
如果你使用了版本控制(比如Git或SVN),你可以直接把現(xiàn)場(chǎng)安裝(live installation)做成你repository的一個(gè)拷貝。當(dāng)你已經(jīng)準(zhǔn)備好升級(jí)時(shí),簡(jiǎn)單到如同從版本控制系統(tǒng)中取出最新的更新一樣。
這令你的文件更新變得 更容易,但你仍然需要考慮手動(dòng)執(zhí)行其他步驟(參考 常見(jiàn)的后部署任務(wù))。
使用平臺(tái)服務(wù) ?
鮮少使用有相關(guān)需求的用戶(hù),請(qǐng)參考Symfony官網(wǎng)原文。另,現(xiàn)代云平臺(tái),比如微軟Azure,都可以一步支持Symfony3+。
不同的服務(wù)供應(yīng)商之間,特殊的部署步驟十分多樣化,因此從以下獨(dú)立文章中查找你所選擇的服務(wù):
- Deploying to Microsoft Azure Website Cloud
- Deploying to fortrabbit
- Deploying to Heroku Cloud
- Deploying to Platform.sh
使用構(gòu)建腳本和其他工具 ?
有幾種工具可以幫助減輕部署時(shí)的痛苦。其中的一些幾乎是為Symfony的需求而量身定制的:
- Capistrano 配合 Symfony plugin
- Capistrano 是一個(gè)Ruby寫(xiě)就的遠(yuǎn)程服務(wù)器的自動(dòng)化和部署工具。Symfony plugin 是一個(gè)簡(jiǎn)化Symfony關(guān)聯(lián)任務(wù)的插件,靈感來(lái)自 Capifony (它僅能和Capistrano 2一起工作)
- sf2debpkg
- 幫你為Symfony項(xiàng)目構(gòu)建一個(gè)原生的Debian包。
- Magallanes
- 這個(gè)“類(lèi)Capistrano”部署工具由PHP構(gòu)建,對(duì)PHP開(kāi)發(fā)者來(lái)說(shuō)可以較容易地?cái)U(kuò)展其需求。
- Fabric
- 這個(gè)基于Python的類(lèi)庫(kù)提供了一個(gè)用來(lái)“執(zhí)行本地或遠(yuǎn)程命令行以及上傳下載文件”的基礎(chǔ)套件。
- Deployer
- 這是又一個(gè)由原生PHP重寫(xiě)的Capistrano,有一些專(zhuān)門(mén)提供給Symfony的功能。
- Bundles
- 有一些 添加了部署功能的bundles 可以直接在你的Symfony控制臺(tái)中使用。
- 基礎(chǔ)腳本
- 你當(dāng)然可以使用命令行, Ant 或其他任何構(gòu)建工具,來(lái)腳本化部署你的項(xiàng)目。
常見(jiàn)的后部署任務(wù) ?
在部署了你的真正源代碼之后,有一些常見(jiàn)事項(xiàng)需要你來(lái)做:
A) 需求檢查 ?
運(yùn)行以下命令以檢查服務(wù)器是否滿(mǎn)足需求:
1 | $ php bin/symfony_requirements |
B) 配置app/config/parameters.yml文件 ?
此文件 不應(yīng) 被部署,而是被Symfony提供的一個(gè)自動(dòng)工具來(lái)管理。
C) 安裝/更新vendors ?
你的vendors(三方包兒)可以在上傳源代碼之前進(jìn)行更新(比如更新 vendor/
目錄,然后再傳源代碼)或是到服務(wù)器上完成更新。不管哪種方式,只需像往常一樣來(lái)更新vendors:
1 | $ composer install --no-dev --optimize-autoloader |
通過(guò)構(gòu)建一個(gè) "class map" 類(lèi)映射,--optimize-autoloader
旗標(biāo)大幅改進(jìn)了Composer的自動(dòng)加載性能。--no-dev
旗標(biāo)可確保開(kāi)發(fā)環(huán)境的包不被安裝到生產(chǎn)環(huán)境。
如果在這一步你得到 "class not found" 錯(cuò)誤,你可能需要在執(zhí)行前述命令之前先運(yùn)行 export SYMFONY_ENV=prod
以便 post-install-cmd
腳本運(yùn)行在 prod
環(huán)境下。
D) 清除Symfony緩存 ?
確保清除(以及warm-up)了你的Symfony緩存。
1 | $ php bin/console cache:clear --env=prod --no-debug |
E) 剝離Assetic資源 ?
如果你使用了Assetic,你需要?jiǎng)冸x出assets:
1 | $ php bin/console assetic:dump --env=prod --no-debug |
F) 其他內(nèi)容! ?
- 運(yùn)行數(shù)據(jù)庫(kù)遷移
- 清除APC緩存
- 運(yùn)行
assets:install
(已經(jīng)在composer install
過(guò)程中被打點(diǎn)好了) - 添加/編輯 CRON 任務(wù)
- 發(fā)布assets資源到CDN
- ...
程序生命周期:持續(xù)整合,質(zhì)量保證等 ?
雖然本文覆蓋了部署過(guò)程的技術(shù)細(xì)節(jié),但是代碼從開(kāi)發(fā)到生產(chǎn)時(shí)的完整生命周期可能需要更多步驟(考慮staging部署,QA[Quality Assurance/質(zhì)量保證],運(yùn)行測(cè)試,等等)
staging、測(cè)試、QA、持續(xù)整合(continuous integration),數(shù)據(jù)庫(kù)遷移以及失敗時(shí)的向下兼容,統(tǒng)統(tǒng)被強(qiáng)烈建議。有各種簡(jiǎn)單或復(fù)雜的工具,其中的某一款會(huì)令你的部署在滿(mǎn)足環(huán)境需求的過(guò)程變得容易(或老練)。
別忘了在部署過(guò)程中也牽扯到更新依賴(lài)(一般通過(guò)Composer),遷移數(shù)據(jù)庫(kù),清除緩存以及其他潛在事項(xiàng),諸如將資源發(fā)布到CDN(參考 常見(jiàn)的后部署任務(wù))。