读了一遍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_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. 条条大道通罗马,如果可能,大家也可以使用别的更好的方式。解决问题的方法不唯一。
因能力有限,内部解析代码没有做改动。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。