Модуль Yet Another Configurations Container
(Yaconf) — контейнер конфигураций. Он разбирает
INI-файлы при запуске PHP и хранит результат
в постоянной памяти в течение всего жизненного цикла PHP, поэтому
каждое обращение — это быстрый поиск в хеш-таблице без обращений
к файлам и без разбора на каждый запрос.
Yaconf хранит каждую конфигурацию как интернированную строку или неизменяемый массив. Для таких данных не ведётся подсчёт ссылок, поэтому извлечение конфигурации из Yaconf фактически обходится без копирования. Начиная с Yaconf 1.2.0 всё разобранное дерево конфигураций вдобавок уплотняется в один непрерывный блок, что снижает накладные расходы по памяти и улучшает локальность кеша.
Разобранная конфигурация находится в постоянной памяти, которую все рабочие процессы PHP-FPM разделяют механизмом копирования при записи: пока файл конфигурации не изменился, рабочие процессы делят одни и те же физические страницы памяти, сколько бы их ни запустили.
Yaconf поддерживает в INI-файлах разделы и наследование разделов. В сборках без ZTS модуль вдобавок автоматически перезагружает файлы при их изменении; в потокобезопасных сборках (ZTS) конфигурации загружаются при запуске, и чтобы подхватить изменения, требуется перезапуск.
Начиная с Yaconf 1.2.0 подкаталоги настроенного каталога загружаются
рекурсивно, на глубину до 16 уровней, и адресуются с названием каталога
как уровнем ключа: например, вызов
Yaconf::get("users.database.master") читает ключ
master из файла database.ini,
который положили в подкаталог users/.
Хранение чувствительных конфигураций вне веб-дерева вдобавок снижает поверхность атаки. Файлы конфигураций под корнем веб-сервера злоумышленник может получить, например через уязвимость раскрытия файлов. С модулем Yaconf файлы .ini вместо этого размещают в каталоге, который доступен на чтение только root, например /etc/yaconf: главный процесс PHP-FPM загружает конфигурации при запуске службы, а порождённым рабочим процессам, которые работают от непривилегированного пользователя и обрабатывают веб-запросы, доступ к этому каталогу не нужен и не предоставляется.
Для работы модуля Yaconf требуется PHP 7.0 или выше.