diff --git a/reference/yaconf/book.xml b/reference/yaconf/book.xml
new file mode 100644
index 000000000..8ea36475b
--- /dev/null
+++ b/reference/yaconf/book.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+ Yaconf
+ Yaconf
+
+
+ &reftitle.intro;
+
+ Yet Another Configurations Container(又一个配置容器,
+ 简称 Yaconf)是一个配置容器。它在 PHP 启动时解析
+ INI 文件,并将解析结果常驻保存在内存中,贯穿 PHP
+ 的整个生命周期。因此每一次读取配置都是一次快速的哈希表查找,
+ 既没有文件 I/O,也不需要每个请求重新解析。
+
+
+ Yaconf 把所有配置以驻留字符串(interned string)或不可变数组的形式存储。
+ 它们不参与引用计数,所以从 Yaconf 读取配置几乎是零拷贝的。
+ 从 Yaconf 1.2.0 起,解析后的整棵配置树还会被进一步压缩到一块连续的
+ 内存中,既降低了内存开销,也提升了缓存局部性。
+
+
+ 解析后的配置保存在持久内存中,所有 PHP-FPM worker 通过写时复制
+ (copy-on-write)共享这份数据:只要配置文件没有变化,无论有多少个
+ worker,它们共享的都是同一份物理内存页。
+
+
+ Yaconf 支持 INI 文件中的 section(节)以及节继承。在非 ZTS 构建下,
+ 它还会在文件变更时自动重新加载;在 ZTS(线程安全)构建下,
+ 配置只在启动时加载一次,变更后需要重启 PHP 才能生效。
+
+
+ 从 Yaconf 1.2.0 起,配置目录下的子目录会被递归加载(最多 16 层深),
+ 子目录名作为一级键参与寻址:例如
+ Yaconf::get("users.database.master") 读取的是
+ users/ 子目录下 database.ini
+ 文件里的 master 键。
+
+
+ 把敏感配置放在 Web 目录之外,也可以缩小攻击面。如果配置文件放在
+ Web 根目录下,攻击者就可能拿到它们,比如通过文件泄露漏洞。
+ 而使用 Yaconf,可以把 .ini 文件放在只有
+ root 可读的目录里,例如 /etc/yaconf:
+ PHP-FPM master 进程在服务启动时加载配置,而实际处理 Web 请求的
+ worker 进程以普通用户身份运行,既不需要、也不会被授予对该目录的
+ 访问权限。
+
+
+ Yaconf 需要 PHP 7.0 及以上版本。
+
+
+
+ &reference.yaconf.setup;
+ &reference.yaconf.yaconf;
+
+
+
+
diff --git a/reference/yaconf/configure.xml b/reference/yaconf/configure.xml
new file mode 100644
index 000000000..9b26d479f
--- /dev/null
+++ b/reference/yaconf/configure.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+ &reftitle.install;
+
+
+ &pecl.info;
+ &url.pecl.package;yaconf
+
+
+
+
+
+
+
diff --git a/reference/yaconf/ini.xml b/reference/yaconf/ini.xml
new file mode 100644
index 000000000..38aeb9168
--- /dev/null
+++ b/reference/yaconf/ini.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+ &reftitle.runtime;
+ &extension.runtime;
+
+
+ Yaconf &ConfigureOptions;
+
+
+
+ &Name;
+ &Default;
+ &Changeable;
+ &Changelog;
+
+
+
+
+ yaconf.directory
+ ""
+ INI_SYSTEM
+
+
+
+ yaconf.check_delay
+ 300
+ INI_SYSTEM
+
+
+
+
+
+
+
+ &ini.descriptions.title;
+
+
+
+
+
+ yaconf.directory
+ string
+
+
+
+ 存放所有 INI 配置文件的目录。只有扩展名为
+ .ini 的文件会被加载。
+ 子目录会被递归加载(最多 16 层深),每一级子目录都作为一级键
+ 参与寻址:例如放在 users/ 子目录下的
+ database.ini 文件,通过
+ "users.database" 访问。该特性自 Yaconf 1.2.0
+ 起提供;在此之前,只有直接位于该目录下的文件会被加载。
+
+
+ 下面的示例假定在配置的目录中放置了如下
+ database.ini,以及一个存放各功能开关设置的
+ features.ini。
+
+
+ INI 文件语法
+
+
+
+
+
+ INI section 示例
+
+
+
+
+
+
+
+
+ yaconf.check_delay
+ int
+
+
+
+ Yaconf 检查已加载的 INI 文件是否发生变更、并重新加载变更文件的时间间隔,
+ 单位为秒(通过比较目录的修改时间来检测变更)。将其设置为
+ 0 时,Yaconf 会在每个请求时都进行检查。
+
+
+
+ 该配置项只在非 ZTS 构建中注册。在 ZTS(线程安全)构建中,
+ 配置仅在启动时加载,不支持自动重新加载;修改后需要重启 PHP
+ 才能生效。
+
+
+
+
+
+
+
+
+
diff --git a/reference/yaconf/setup.xml b/reference/yaconf/setup.xml
new file mode 100644
index 000000000..5a220d7ac
--- /dev/null
+++ b/reference/yaconf/setup.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+ &reftitle.setup;
+
+
+ &reftitle.required;
+
+ Yaconf 需要 PHP 7.0 及以上版本。
+
+
+
+
+ &reftitle.install;
+
+ Yaconf 有三种安装方式:通过 PECL 安装、通过 PIE 安装,
+ 或者从源码编译。
+
+
+ &pecl.moved;
+
+
+ &pecl.info;
+ &url.pecl.package;yaconf.
+
+
+ &pecl.windows.download.avail;
+
+
+ 使用 PECL 安装 Yaconf
+
+
+
+
+
+ 从 Yaconf 1.2.0 起,还可以使用扩展安装器 &link.pie;
+ (PHP Installer for Extensions)来安装,在命令行中执行:
+
+
+ 使用 PIE 安装 Yaconf
+
+
+
+
+
+ 源码托管在
+ GitHub
+ 上。如需从源码编译安装,请在命令行中执行以下命令,
+ 并将路径替换为本地 PHP 安装的实际路径:
+
+
+ 从源码编译 Yaconf
+
+
+
+
+
+
+ &reference.yaconf.ini;
+
+
+ &reftitle.resources;
+
+
+
+
+
+
+
+
diff --git a/reference/yaconf/versions.xml b/reference/yaconf/versions.xml
new file mode 100644
index 000000000..485d63a4a
--- /dev/null
+++ b/reference/yaconf/versions.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/reference/yaconf/yaconf.xml b/reference/yaconf/yaconf.xml
new file mode 100644
index 000000000..925b6b106
--- /dev/null
+++ b/reference/yaconf/yaconf.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+ Yaconf 类
+ Yaconf
+
+
+
+
+
+ &reftitle.intro;
+
+ Yaconf 是一个配置容器。它解析 INI 文件,
+ 并在 PHP 启动时将解析结果保存在 PHP 中,
+ 这些结果的生命周期贯穿整个 PHP 进程。
+
+
+
+
+
+ &reftitle.classsynopsis;
+
+
+
+ Yaconf
+
+
+
+
+ Yaconf
+
+
+
+
+ &Methods;
+
+
+
+
+
+
+
+
+ &reference.yaconf.entities.yaconf;
+
+
+
+
diff --git a/reference/yaconf/yaconf/debuginfo.xml b/reference/yaconf/yaconf/debuginfo.xml
new file mode 100644
index 000000000..ac1625dae
--- /dev/null
+++ b/reference/yaconf/yaconf/debuginfo.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+ Yaconf::__debug_info
+ 查看某个配置值的存储方式
+
+
+
+ &reftitle.description;
+
+ public static arraynullYaconf::__debug_info
+ stringname
+
+
+ 返回以 name
+ 该值在内存中的地址,以及该值是否仍然存放在 Yaconf
+ 压缩后的存储块中。
+
+
+
+ 该方法存在的唯一目的是供 Yaconf 自身的测试套件使用,
+ 测试用它来验证扩展是否工作正常。请勿在生产代码中使用它,
+ 也不要依赖其输出格式:返回的数组可能随时变化。
+
+
+
+
+
+ &reftitle.parameters;
+
+
+ name
+
+
+ 要查看的配置名,使用与 Yaconf::get
+ 相同的点号记法。
+
+
+
+
+
+
+
+ &reftitle.returnvalues;
+
+ 当配置存在时,返回一个包含四个元素的 array;
+ 否则返回 &null;:
+
+
+
+
+ key —— 被查找的配置名。
+
+
+
+
+ address —— 该值在内存中的地址。
+ 配置值以驻留字符串(interned string)或不可变数组的形式存储,
+ 因此在配置被重新加载之前,该地址保持不变。
+
+
+
+
+ val —— 存储的值本身。
+
+
+
+
+ changed —— 当该值的数据仍存放在压缩存储块内时
+ 为 &false;,表示操作系统尚未复制过该内存页(写时复制仍然有效);
+ 当该值被重新分配到存储块之外时为 &true;。
+
+
+
+
+
+
+ &reftitle.examples;
+
+ Yaconf::__debug_info 示例
+
+
+ string(8) "app.name"
+ ["address"]=>
+ string(14) "0x7f8b1c0a3d20"
+ ["val"]=>
+ string(4) "shop"
+ ["changed"]=>
+ bool(false)
+}
+*/
+
+var_dump(Yaconf::__debug_info("app.missing")); // NULL
+?>
+]]>
+
+
+
+
+
+ &reftitle.seealso;
+
+
+ Yaconf::get
+ Yaconf::has
+
+
+
+
+
+
+
diff --git a/reference/yaconf/yaconf/get.xml b/reference/yaconf/yaconf/get.xml
new file mode 100644
index 000000000..379e986e4
--- /dev/null
+++ b/reference/yaconf/yaconf/get.xml
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+ Yaconf::get
+ 按名称读取一个配置值
+
+
+
+ &reftitle.description;
+
+ public static mixedYaconf::get
+ stringname
+ mixeddefault&null;
+
+
+ 读取以 name
+ 形式寻址,逐层定位嵌套的键:例如 "app"
+ 中某个键的值。自 Yaconf 1.2.0 起,还支持
+ "users.database.master"
+ 子目录下的 database.ini 文件中的键。
+ 点号记法最多支持 64 层嵌套。
+
+
+
+
+ &reftitle.parameters;
+
+
+ name
+
+
+ 要查找的配置名。使用点号记法逐层定位嵌套的键,例如
+ "app.name"
+ "users.database.master"
+
+
+
+
+ default
+
+
+ 当 name
+ 时返回该值。未指定时返回 &null;。
+
+
+
+
+
+
+
+ &reftitle.returnvalues;
+
+ 当 name
+ array;否则返回 default
+ 参数,则返回 &null;)。
+
+
+
+
+ &reftitle.examples;
+
+ 下面的示例假定在 yaconf.directory 配置的目录中
+ 放置了以下两个文件。
+
+
+
+
+
+
+
+
+ Yaconf::get 示例
+
+
+]]>
+
+
+
+
+
+ &reftitle.seealso;
+
+
+ Yaconf::has
+ Yaconf::__debug_info
+
+
+
+
+
+
+
diff --git a/reference/yaconf/yaconf/has.xml b/reference/yaconf/yaconf/has.xml
new file mode 100644
index 000000000..ce0c8273a
--- /dev/null
+++ b/reference/yaconf/yaconf/has.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+ Yaconf::has
+ 检查某个配置值是否存在
+
+
+
+ &reftitle.description;
+
+ public static boolYaconf::has
+ stringname
+
+
+ 判断在 name
+ 使用与 Yaconf::get 相同的点号记法:
+ 例如 "app.name"
+ 还可以用 "users.database.master"
+
+
+
+
+ &reftitle.parameters;
+
+
+ name
+
+
+ 要查找的配置名。使用点号记法逐层定位嵌套的键,例如
+ "app.name"
+
+
+
+
+
+
+
+ &reftitle.returnvalues;
+
+ 如果在 name
+ &false;。
+
+
+
+
+ &reftitle.examples;
+
+ 下面的示例假定在 yaconf.directory 配置的目录中
+ 放置了一个 app.ini,其中包含
+ name="shop" 和 debug=0 两个键。
+
+
+ Yaconf::has 示例
+
+
+]]>
+
+
+
+
+
+ &reftitle.seealso;
+
+
+ Yaconf::get
+ Yaconf::__debug_info
+
+
+
+
+
+
+