说到Yaconf, 从我14年进入WB就开始用了。确实帮助咱们解决了不少问题,但同时咱们理解不全,也碰到了一些状况,如今说说这些内容。php
关于yaconf的介绍,我就不解释了,请看 Laruence 的这篇文章。
http://www.laruence.com/2015/06/12/3051.htmlhtml
Yaconf是php的一个扩展,。没有独立的进程守护, 内存中的配置信息不能单独存在,主要是为web应用服务的。
根据php-fpm的运行原理,Yaconf在PHP_MINIT_FUNCTION函数里面初始化配置,而后在PHP_RINIT_FUNCTION函数里面根据条件更新配置。这样当一个web请求时,会触发PHP_RINIT_FUNCTION这个函数,从而自动根据条件更新配置。web
Yaconf首先检测的是配置文件夹的修改时间,曾经碰到过一种状况,当用fwrite更改写入文件内容的时候,文件夹的mtime是不会变化的,此时若是把文件夹推到线上,会由于配置文件夹的st_mtime没有变化而致使配置没有生效。
临时解决方案:推送以前,更改配置文件夹的mtime。服务器
这个问题应该不是Yaconf自己的问题,某一次时候,admin管理后台空间不足。某个配置文件生成的时候,没有写入。形成为空的状况,进而上传到服务器上形成错误。
解决方案:生成ini配置文件的时候,进行脚本检测。若是为空,则不生成ini文件。上传的时候进行脚本检测,当有大小为0的空文件,则不进行上传(不是最好的解决方案, 逐步完善中)。ide
如上内容, 若是值是英文字母或者数字没有问题,若是是汉字,或者其中带有括号等内容,生成的配置文件就不生效了。因此 咱们每一个值都用双引号括了起来。转移特殊的字符。
正确的写法函数a.b = "(测试ok)"错误的写法php-fpm
a.b = (测试ok)
这个问题是我在作某运动项目中碰到的,当时后台能够自定义字段,即数据字典前移。产品能够直接在表单上追加字段。一个新的PM,因而把带有括号的字符串,做为了key。这样生成的ini中就含有带特殊字符的key。配置文件同步到线上的时候,基本上只剩下找锅的工做了。
如:测试(abc) = "出bug了"5. 降级文件采用Yaconf读取ini文件
这个事实上仍是没有理解Yaconf的原理,使用操做不当形成的。降级的时候,上传了降级的配置ini文件,实施了降级。可是结束后,直接删掉了降级的a. ini文件。而线上环境又没有通过大重启(M_SHUTDOWN)。 当每次request来的时候,即便会检测配置的目录里面的文件,也会由于没有降级文件a, 而不会更新内存中a对应的配置。
解决方案:上传a.ini文件,可是里面能够写一项其余内容。或者不采用Yaconf读取文件。code
Yaconf相对其余扩展来讲,源代码仍是比较容易读懂的。闲的时候能够认真读一读,对你有帮助。htm