Yaconf 是一個高效能的組態管理擴充,是由PHP核心開發人員鳥哥惠新宸發布的 PHP7 下的擴充應用。主要目標是簡化讀取項目設定檔, 使設定檔和項目代碼分離,增強了設定檔的可讀性和可維護性。
據 Yaconf 開發人員惠新宸在其部落格上說,這個項目是其在來微博以後, 第一個最佳化項目中順手做的一個小工具, 本身叫做Weibo_Conf. 但是因為 Weibo_Conf 是屬於 Weibo 擴充的, 裡面還有一些其他功能是專門為 Weibo 定製的. 所以不適合直接開源.隨著 PHP7 的發布, 新增了很多持久化類型的支援比如 IS_IMMUTABLE_ARRAY , 於是就在 PHP7 下重新開發了 Yaconf , 開源出來, 方便大家使用。
首先說說, 這個是幹啥的:
我見過很多的項目中, 用 PHP 檔案做配置的, 一個 config 目錄下可能有十幾個甚至數十個 .php 設定檔, 裡面都是各種各樣的 array , 還有甚者會把一些詞典檔案(比如中文/英文對照)也放到配置中去. 這就導致設定檔的解析耗費了很大的效能(誠然, 用了 opcache 能好點, 但是實際上還是有執行的過程).
除了 PHP 的, 還有用 json 的, yaml 的, 一個共同的特點就是這些配置的可讀性比較差. 另外, 他們也都要 runtime 解析.
config 目錄往往和代碼在一起, 首先會有安全隱患(配置中往往有敏感資訊), 其次如果配置和代碼屬於一個項目, 這就會導致配置的修改也要走代碼上線的流程.
一些資源設定檔, 比如 mysql/memcache 的配置資訊, 這些內容本來是應該對開發透明的, 營運直接負責即可. 但是放到了代碼中就會導致, 營運如果要發起一些變更, 也要開發配合修改設定檔上線.
所以, Yaconf就是為瞭解決這些問題而生的一個工具.
它使用單獨的一個配置目錄(在 yaconf.directory 指定), 不和代碼在一起.
它在 PHP 啟動的時候, 處理所有的要處理的配置, 然後這些配置就會常駐記憶體, 隨著 PHP 的生命週期存亡. 避免了每次請求的時候解析設定檔.
所有的配置內容都是 immutable 的, 這就可以藉助於 Fork 的 COW , 降低記憶體佔用, 並且在訪問配置的時候, 幾乎不需要任何的記憶體 Copy, 也不會有無謂的引用計數增減
最重要的, 配置目錄和代碼分離以後, 可以藉助一個組態管理後台, 來實現配置的統一化管理.
它支援(對於非ZTS)配置變更重新載入, 也就是說配置如果有變化(建議更改配置一定使用 mv , 不要使用 cp ), 它會 reload, 不需要重啟(檢測的頻率由 yaconf.check_delay 控制).
它支援豐富的配置類型, 包括字串, 數組, 分節, 分節繼承
, 並且還可以在配置中直接寫 PHP 的常量和環境變數等.
最重要的是, 它很簡單。