配置文件基本可以說(shuō)是每個(gè)項(xiàng)目都會(huì)有,在配置文件中我們通常會(huì)配置數(shù)據(jù)庫(kù)訪問(wèn)地址、redis連接、url地址等等。早年開(kāi)發(fā)的時(shí)候經(jīng)常碰到這樣麻煩的問(wèn)題:就是本地開(kāi)發(fā)環(huán)境的配置和測(cè)試環(huán)境、生產(chǎn)環(huán)境的配置都不全一樣,像數(shù)據(jù)庫(kù)連接配置、url地址配置等,每次更新項(xiàng)目到測(cè)試環(huán)境、生產(chǎn)環(huán)境的時(shí)候都需要修改配置,真的是非常麻煩。
幸好yaf對(duì)于配置文件的解析提供了節(jié)(section)的支持,并且還支持節(jié)之間的繼承功能,將節(jié)的設(shè)置和yaf運(yùn)行環(huán)境(yaf.environ)結(jié)合起來(lái)就可以達(dá)到很好的配置效果,且看如何實(shí)現(xiàn)。
配置運(yùn)行環(huán)境
在配置php支持yaf的時(shí)候,可以設(shè)置一個(gè)參數(shù)yaf.environ:把本地開(kāi)發(fā)設(shè)置成develop、測(cè)試環(huán)境配置成test、生產(chǎn)環(huán)境配置成product,如:
[yaf]
extension=yaf.so
yaf.use_namespace=1
yaf.environ=develop
通過(guò)設(shè)置運(yùn)行環(huán)境,在項(xiàng)目中可以通過(guò)ini_get(‘yaf.environ’)獲取環(huán)境參數(shù),進(jìn)而取到相應(yīng)節(jié)的配置。
文件配置
yaf配置文件一般都放在項(xiàng)目的conf文件夾下,這里也不例外。yaf application實(shí)例化的時(shí)候需要傳遞一個(gè)配置文件路徑,假設(shè)我們的配置文件叫application.ini,先看下application.ini的結(jié)構(gòu):
[common]
; 通用配置
[product : common]
; 生產(chǎn)環(huán)境配置
[test : common]
; 測(cè)試環(huán)境配置
[develop : common]
; 開(kāi)發(fā)環(huán)境配置
這里的配置除了節(jié)之外,節(jié)和節(jié)之間還有繼承關(guān)系。例如[product : common]就表示product的配置會(huì)繼承common的配置。先配置一個(gè)數(shù)據(jù)庫(kù)連接看看。
[common]
; 通用配置
; 數(shù)據(jù)庫(kù)配置
resources.database.params.driver = pdo_mysql
resources.database.params.hostname = 127.0.0.1
resources.database.params.port = 3306
resources.database.params.database = database
resources.database.params.username = username
resources.database.params.password = password
resources.database.params.charset = utf8
resources.database.params.driver_options.1002 = set names utf8
[product : common]
; 生產(chǎn)環(huán)境配置
[test : common]
; 測(cè)試環(huán)境配置
[develop : common]
; 開(kāi)發(fā)環(huán)境配置
resources.database.params.hostname = 127.0.0.1
resources.database.params.database = database
resources.database.params.username = username
resources.database.params.password = password
yaf在實(shí)例化應(yīng)用的傳遞該配置文件路徑和運(yùn)行環(huán)境:
define(application_path, realpath(dirname(__file__) . '/../'));
$app = new \yaf\application(application_path . /conf/application.ini, ini_get('yaf.environ'));
這樣當(dāng)項(xiàng)目運(yùn)行環(huán)境在develop下的時(shí)候,會(huì)優(yōu)先讀取[develop : common]內(nèi)的配置,如果沒(méi)有則會(huì)從[common]中獲取。在項(xiàng)目中任何地方都可以通過(guò)
\yaf\application::app()->getconfig();
獲取application.ini中的配置。
事實(shí)上該例中可以不用傳遞ini_get(‘yaf.environ’)參數(shù),在實(shí)例化的時(shí)候yaf會(huì)自行讀取php.ini中的yaf.environ參數(shù)。但如果是其它的配置文件,則需要傳遞該參數(shù)。
額外的配置
隨著項(xiàng)目越來(lái)越龐大,配置也會(huì)越來(lái)越復(fù)雜,如果都放在項(xiàng)目默認(rèn)的配置文件application.ini中,可能配置會(huì)有好幾百行,這樣就不容易維護(hù)了。一般我們會(huì)考慮新建配置文件用來(lái)存儲(chǔ)額外的配置。yaf中提供了\yaf\config\ini類來(lái)處理這些額外的配置文件。
$config = new \yaf\config\ini(application_path . '/conf/url.ini', ini_get('yaf.environ'));
在實(shí)際讀取的時(shí)候,最好能設(shè)置一個(gè)靜態(tài)變量保存讀取到的配置,避免重復(fù)申請(qǐng)系統(tǒng)open函數(shù)調(diào)用。如下:
static $config = null;
if ($config === null) {
$config = new \yaf\config\ini(application_path . '/conf/url.ini', ini_get('yaf.environ'));
}
詳細(xì)可以參考yaf擴(kuò)展示例bootstrap中的geturliniconfig方法。
配置文件緩存
yaf官方有提到可以通過(guò)yaf.cache_config來(lái)緩存配置文件提高性能,但筆者在實(shí)際測(cè)試中發(fā)現(xiàn)差別不大,估計(jì)是由于配置文件還不夠大的原因,因?yàn)椴鸱至伺渲茫坑信d趣的小伙伴可以自行研究測(cè)試下,歡迎分享。
小結(jié)
通過(guò)這樣的配置方式我們很好地解決了配置文件的管理問(wèn)題,可以很方便將整個(gè)版本庫(kù)的代碼直接推送到測(cè)試環(huán)境和發(fā)布到生產(chǎn)環(huán)境。需要注意的是:如果生產(chǎn)環(huán)境的配置有較強(qiáng)的保密性,那就只能在發(fā)布的時(shí)候進(jìn)行配置了。