Introduction
Yet Another Configurations Container
(Yaconf) is a configuration container. It parses
INI files when PHP starts up and keeps the result
in persistent memory for the whole PHP lifecycle, so every retrieval
is a fast hash lookup with no file I/O and no per-request parsing.
Yaconf stores all configurations as interned strings or immutable
arrays. They are not refcounted, so retrieving a configuration from
Yaconf is effectively zero-copy. Since Yaconf 1.2.0, the whole parsed
configuration tree is additionally compacted into a single contiguous
block, which lowers memory overhead and improves cache locality.
The parsed configuration lives in persistent memory shared by all
PHP-FPM workers through copy-on-write: until a configuration file
changes, the workers share the same physical memory pages no matter
how many of them are running.
Yaconf supports sections and section inheritance in INI files. On
non-ZTS builds it also reloads the files automatically when they
change; on ZTS (thread-safe) builds, configurations are loaded at
startup and a restart is required to pick up changes.
Since Yaconf 1.2.0, sub-directories of the configured directory are
loaded recursively (up to 16 levels deep) and addressed with the
directory name as a key level: for example,
Yaconf::get("users.database.master") reads the
master key from the file
database.ini placed in the
users/ sub-directory.
Storing sensitive configurations outside the web tree also lowers
the attack surface. Configuration files under the web root can be
retrieved by an attacker, for example through a file disclosure
vulnerability. With Yaconf, the .ini files can
instead be placed in a directory readable only by root, such as
/etc/yaconf: the PHP-FPM master loads the
configurations when the service starts, while the forked workers —
which run under an unprivileged user and are the ones executing
web requests — do not need, and are not given, access to that
directory.
Yaconf requires PHP 7.0 or greater.