读了一遍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. 条条大道通罗马,若是可能,你们也能够使用别的更好的方式。解决问题的方法不惟一。
因能力有限,内部解析代码没有作改动。