配置文件基本可以說是每個項目都會有,在配置文件中我們通常會配置數據庫訪問地址、redis連接、url地址等等。早年開發的時候經常碰到這樣麻煩的問題:就是本地開發環境的配置和測試環境、生產環境的配置都不全一樣,像數據庫連接配置、url地址配置等,每次更新項目到測試環境、生產環境的時候都需要修改配置,真的是非常麻煩。
幸好yaf對于配置文件的解析提供了節(section)的支持,并且還支持節之間的繼承功能,將節的設置和yaf運行環境(yaf.environ)結合起來就可以達到很好的配置效果,且看如何實現。
配置運行環境
在配置php支持yaf的時候,可以設置一個參數yaf.environ:把本地開發設置成develop、測試環境配置成test、生產環境配置成product,如:
[yaf]
extension=yaf.so
yaf.use_namespace=1
yaf.environ=develop
通過設置運行環境,在項目中可以通過ini_get(‘yaf.environ’)獲取環境參數,進而取到相應節的配置。
文件配置
yaf配置文件一般都放在項目的conf文件夾下,這里也不例外。yaf application實例化的時候需要傳遞一個配置文件路徑,假設我們的配置文件叫application.ini,先看下application.ini的結構:
[common]
; 通用配置
[product : common]
; 生產環境配置
[test : common]
; 測試環境配置
[develop : common]
; 開發環境配置
這里的配置除了節之外,節和節之間還有繼承關系。例如[product : common]就表示product的配置會繼承common的配置。先配置一個數據庫連接看看。
[common]
; 通用配置
; 數據庫配置
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]
; 生產環境配置
[test : common]
; 測試環境配置
[develop : common]
; 開發環境配置
resources.database.params.hostname = 127.0.0.1
resources.database.params.database = database
resources.database.params.username = username
resources.database.params.password = password
yaf在實例化應用的傳遞該配置文件路徑和運行環境:
define(application_path, realpath(dirname(__file__) . '/../'));
$app = new \yaf\application(application_path . /conf/application.ini, ini_get('yaf.environ'));
這樣當項目運行環境在develop下的時候,會優先讀取[develop : common]內的配置,如果沒有則會從[common]中獲取。在項目中任何地方都可以通過
\yaf\application::app()->getconfig();
獲取application.ini中的配置。
事實上該例中可以不用傳遞ini_get(‘yaf.environ’)參數,在實例化的時候yaf會自行讀取php.ini中的yaf.environ參數。但如果是其它的配置文件,則需要傳遞該參數。
額外的配置
隨著項目越來越龐大,配置也會越來越復雜,如果都放在項目默認的配置文件application.ini中,可能配置會有好幾百行,這樣就不容易維護了。一般我們會考慮新建配置文件用來存儲額外的配置。yaf中提供了\yaf\config\ini類來處理這些額外的配置文件。
$config = new \yaf\config\ini(application_path . '/conf/url.ini', ini_get('yaf.environ'));
在實際讀取的時候,最好能設置一個靜態變量保存讀取到的配置,避免重復申請系統open函數調用。如下:
static $config = null;
if ($config === null) {
$config = new \yaf\config\ini(application_path . '/conf/url.ini', ini_get('yaf.environ'));
}
詳細可以參考yaf擴展示例bootstrap中的geturliniconfig方法。
配置文件緩存
yaf官方有提到可以通過yaf.cache_config來緩存配置文件提高性能,但筆者在實際測試中發現差別不大,估計是由于配置文件還不夠大的原因,因為拆分了配置?有興趣的小伙伴可以自行研究測試下,歡迎分享。
小結
通過這樣的配置方式我們很好地解決了配置文件的管理問題,可以很方便將整個版本庫的代碼直接推送到測試環境和發布到生產環境。需要注意的是:如果生產環境的配置有較強的保密性,那就只能在發布的時候進行配置了。
如何通過云服務器做網站昨天問題處理了么現在還是無法打開東南亞云服務器租用購買網站開啟云加速就不能訪問Hostens國外VPS重裝系統教程域名備案方式-域名及賬戶問題數據庫切換成切換到以上數據庫管理沒有看見操作的地方給操作下騰訊云的云服務器ecshop