说到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首先检测的是配置文件夹的修改时间,曾经碰到过一种情况,当用fwrite更改写入文件内容的时候,文件夹的mtime是不会变化的,此时如果把文件夹推到线上,会因为配置文件夹的st_mtime没有变化而导致配置没有生效。
临时解决方案:推送之前,更改配置文件夹的mtime。
一些使用Yaconf的经验分享_第1张图片

2. 文件内容为空

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

3. 文件内容有误

一些使用Yaconf的经验分享_第2张图片

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

a.b = "(测试ok)"

错误的写法

a.b = (测试ok)

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

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

(abc) = "出bug了"

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

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

后记

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