爲Yaconf的添加測試場景(練習用)

讀了一遍yaconf的源碼,發現大部分可以理解。在這個項目上結合現實中使用的兩個場景進行進行一些小改動是個比較有趣的事情。

代碼地址:https://github.com/netbird/yaconf


業務場景一

在自己的測試環境,各個業務方要求某個業務的api必須長期指向他們的測試環境供他們測試。之前做法有修改host(碰到非80端口失靈),修改代碼,修改配置文件。而這套環境又有新的開發任務,需要隨時更新代碼和配置文件,不更新會導致其他業務失敗,所以不能加鎖。經常造成代碼和配置覆蓋。不得不重新修改配置文件和代碼滿足之前的測試環境。。。


因代碼配置文件基於yaconf的。所以修改了下yaconf的源碼,提供了一種小方案。


在不修改配置文件和主項目代碼的情況下。

增加測試模式和測試配置文件目錄。

yaconf設置成測試模式下,在directory_test添加自己需要滿足測試需要的配置文件(可以是局部內容)。

在讀取配置的時候 就優先讀取測試內容,然後在讀取通用配置。


例如

配置文件:

    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_FUNCTIONPHP_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. 條條大道通羅馬,如果可能,大家也可以使用別的更好的方式。解決問題的方法不唯一。


     因能力有限,內部解析代碼沒有做改動。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章