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; + + <methodname>Yaconf::__debug_info</methodname> 示例 + + + 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 配置的目录中 + 放置了以下两个文件。 + + + + + + + + + <methodname>Yaconf::get</methodname> 示例 + + +]]> + + + + + + &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 两个键。 + + + <methodname>Yaconf::has</methodname> 示例 + + +]]> + + + + + + &reftitle.seealso; + + + Yaconf::get + Yaconf::__debug_info + + + + + + +