說到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