讀了一遍yaconf的源碼,發現大部分能夠理解。在這個項目上結合現實中使用的兩個場景進行進行一些小改動是個比較有趣的事情。git
代碼地址:https://github.com/netbird/yaconfgithub
業務場景一web
在本身的測試環境,各個業務方要求某個業務的api必須長期指向他們的測試環境供他們測試。以前作法有修改host(碰到非80端口失靈),修改代碼,修改配置文件。而這套環境又有新的開發任務,須要隨時更新代碼和配置文件,不更新會致使其餘業務失敗,因此不能加鎖。常常形成代碼和配置覆蓋。不得不從新修改配置文件和代碼知足以前的測試環境。。。api
因代碼配置文件基於yaconf的。因此修改了下yaconf的源碼,提供了一種小方案。ide
在不修改配置文件和主項目代碼的狀況下。函數
增長測試模式和測試配置文件目錄。測試
在yaconf設置成測試模式下,在directory_test添加本身須要知足測試須要的配置文件(能夠是局部內容)。spa
在讀取配置的時候 就優先讀取測試內容,而後在讀取通用配置。orm
例如: 接口
配置文件:
a.ini的內容
a="b"
b="c"
此時讀取Yaconf::get(‘a.a’) 獲得的是b。
設置測試模式,裏面測試配置:
a.ini
a="d"
此時讀取Yaconf::get('a.a') 獲得的是d。
固然,總體讀取Yaconf::get('a'),會致使讀取不到a.b的內容,具體依據本身使用的場景。
PS:僅在測試環境下看成練習使用,不適用全部場景。
業務場景二
如何在CLI模式下使用Yaconf
雖然Yaconf更適合web請求場景,不太適合在CLI模式下使用,可是受限與環境, 歷史(業務難分離)等問題,又急切想使用Yaconf怎麼辦?
Yaconf的原理是在PHP_MINIT_FUNCTION函數裏面初始化配置,而後在PHP_RINIT_FUNCTION函數裏面根據條件更新配置。這樣當一個web請求時,會觸發PHP_RINIT_FUNCTION這個函數,從而自動根據條件更新配置。
而CLI模式模式下,若是進程不退出,那麼只在啓動的時候執行一次PHP_MINIT_FUNCTION和PHP_RINIT_FUNCTION,此時沒法更新配置信息。
解決方案:
增長外部觸發函數,手動執行更新。即:增長Yaconf::update()方法,在代碼中,適合的位置去執行這個函數,觸發更新。
固然,更新的原則和原理仍是跟PHP_RINIT_FUNCTION同樣。
如配置文件:
a.ini
a="b"
代碼:
while(true) {
Yaconf::update();
var_dump(Yaconf::get('a.a'));
}
此時,若是將配置文件改爲:
a="c"
則上述程序會在check_delay(一般5分鐘)後,輸出c(不用退出進程,便可更新).
目前,尚未投入正式環境。若是你們有這個使用場景,能夠考慮以上方式。
ps: 1. 限於本人能力,僅僅包了個接口,沒有對內部進行合併邏輯處理,重在解決問題。
2. 條條大道通羅馬,若是可能,你們也能夠使用別的更好的方式。解決問題的方法不惟一。
因能力有限,內部解析代碼沒有作改動。