一些使用Yaconf的经验分享

说到Yaconf, 从我14年进入WB就开始用了。确实帮助我们解决了很多问题,但同时我们理解不全,也碰到了一些情况,现在说说这些内容。

介绍

关于yaconf的介绍,我就不解释了,请看 Laruence 的这篇文章。
http://www.laruence.com/2015/06/12/3051.html

运行原理

Yaconf是php的一个扩展,。没有独立的进程守护, 内存中的配置信息不能单独存在,主要是为web应用服务的。
根据php-fpm的运行原理,Yaconf在PHP_MINIT_FUNCTION函数里面初始化配置,然后在PHP_RINIT_FUNCTION函数里面根据条件更新配置。这样当一个web请求时,会触发PHP_RINIT_FUNCTION这个函数,从而自动根据条件更新配置。

曾经走过的路

1. 文件夹时间没有更新

Yaconf首先检测的是配置文件夹的修改时间,曾经碰到过一种情况,配置从多个地方rsync同步,有一个模块由于没有文件夹改动,所以不会变更文件夹的数据修改时间,而线上的配置文件目录又是同这个目录的,这就造成了线上配置文件的目录时间没变。
影响:配置推到线上没有生效。
解决方案:统一推送机器,从一个源向线上服务器推送配置文件。

2. 文件内容为空

这个问题应该不是Yaconf本身的问题,某一次时候,admin管理后台空间不足。某个配置文件生成的时候,没有写入。造成为空的情况,进而上传到服务器上造成错误。
解决方案:生成ini配置文件的时候,进行脚本检测。如果为空,则不生成ini文件。上传的时候进行脚本检测,当有大小为0的空文件,则不进行上传(不是最好的解决方案, 逐步完善中)。

3. 文件内容有误

一些使用Yaconf的经验分享

如上内容, 如果值是英文字母或者数字没有问题,如果是汉字,或者其中带有括号等内容,生成的配置文件就不生效了。所以 我们每个值都用双引号括了起来。转移特殊的字符。

4. 生成的文件内容的key有失误

这个问题是我在做某运动项目中碰到的,当时后台可以自定义字段,即数据字典前移。产品可以直接在表单上追加字段。一个新的PM,于是把带有括号的字符串,作为了key。这样生成的ini中就含有带特殊字符的key。配置文件同步到线上的时候,基本上只剩下找锅的工作了。
如:(abc) = "出bug了"

5. 降级文件采用Yaconf读取ini文件

这个事实上还是没有理解Yaconf的原理,使用操作不当造成的。降级的时候,上传了降级的配置ini文件,实施了降级。但是结束后,直接删掉了降级的a. ini文件。而线上环境又没有经过大重启(M_SHUTDOWN)。 当每次request来的时候,即使会检测配置的目录里面的文件,也会因为没有降级文件a, 而不会更新内存中a对应的配置。
解决方案:上传a.ini文件,但是里面可以写一项其他内容。或者不采用Yaconf读取文件。

后记

Yaconf相对其他扩展来说,源代码还是比较容易读懂的。闲的时候可以认真读一读,对你有帮助。

猜你喜欢

转载自blog.51cto.com/9681602/2136428