上篇文章我们介绍了一个比较出名的 YAML 格式的配置文件相关的操作,今天我来学习另外一个配置文件扩展。这个配置文件的写法其实与 php.ini 的这种 PHP 标准的配置格式比较类似,但是又有一些不同。不过内容非常简单,大家仅供参考。
Yaconf 配置文件及格式
Yaconf 从名字是不是看出什么端倪了?没错,和 Yaf 、Yac 一样,又是我们鸟哥的作品。不得不说大神还是为我们贡献了很多很好的作品哦。后面我们还会讲一个它的小众开源扩展,而 Yaf 扩展我们将在未来学习框架的时候再深入地进行学习。
Yaconf 的安装也是普通地扩展安装的方式,不过它需要 PHP7 以上的版本。另外,在安装之后还需要在 php.ini 文件中指定 yaconf.directory ,也就是配置文件存放的目录。这个属性是不能通过 ini_set() 配置的,也就是必须在程序运行前就载入到 PHP 运行环境中。我们按照文档的说明将它配置为 /tmp/conf ,然后在这个目录下建立自己需要的配置文件就可以了。
Yaconf 的语法非常简洁,鸟哥的作品都主打性能,所以 Yaconf 也是一个高性能的配置管理扩展。关于 Yaconf 的具体介绍可以查看文章最下方第二条链接的说明,在这里我们就看一些它的语法以及具体的使用。
foo="bar"
phpversion=PHP_VERSION
env=${HOME}
arr.0=1
arr.1=2
arr[]=3
arr[3]=4
map.foo=bar
map.bar=foo
map.foo.name=yaconf
看出来什么特点了吗?首先,如果是带双引号的内容,会将这个配置变量当成字符串,如果不是双引号的,则会尝试以 PHP 来进行解析。然后数组和 HashMap 这样的写法也都是完美支持的。似乎是比 php.ini 的写法强悍了一些。不过还不止。
[parent]
parent="base"
children="NULL"
[children : parent]
children="children"
嗯,你没看错,它还可以支持这样的继承写法,中括号标示的内容可以看作是一个配置片断,或者说一节内容,具体作用我们后面会看到。
获取配置内容
配置语法就是这些,接下来我们要具体看看这些配置信息要怎么读取出来。这个扩展其实就提供了两个函数,一个用于读取,一个用于查询配置是否存在,我们先来看一下如何读取数据。
var_dump(Yaconf::get("test.foo")); // string(3) "bar"
var_dump(Yaconf::get("test.phpversion")); // string(5) "7.4.4"
var_dump(Yaconf::get("test.env")); // string(5) "/root"
这个函数相信不用多解释了,test 是我们的文件名,也就是在 /tmp/conf/test.ini 这个文件中,我们把上面的测试配置信息写在了这个配置里面。当然,我们也可以在这个目录中定义更多的配置文件,比如我们另外定义了一个配置文件 foo.ini ,那么就可以这么读取:
var_dump(Yaconf::get("foo.SectionA.key")); // string(3) "val"
对于数组配置信息来说,直接获取到的内容返回的就是数组格式的。
var_dump(Yaconf::get("test.arr"));
// array(4) {
// [0]=>
// string(1) "1"
// [1]=>
// string(1) "2"
// [2]=>
// string(1) "3"
// [3]=>
// string(1) "4"
// }
var_dump(Yaconf::get("test.arr.1")); // string(1) "2"
var_dump(Yaconf::get("test.map"));
// array(2) {
// ["foo"]=>
// array(1) {
// ["name"]=>
// string(6) "yaconf"
// }
// ["bar"]=>
// string(3) "foo"
// }
var_dump(Yaconf::get("test.map.foo.name")); // string(6) "yaconf"
在获取数组内部的数据时,我们直接使用 . 来获取序列的内容就可以了。最后就是上面提到过的分片和继承的功能。
var_dump(Yaconf::get("test.parent.parent")); // string(4) "base"
var_dump(Yaconf::get("test.children.parent")); // string(4) "base"
var_dump(Yaconf::get("test.parent.children")); // string(4) "NULL"
var_dump(Yaconf::get("test.children.children")); // string(8) "children"
test 是文件名,而 parent 就是我们定义在中括号里面的分片名称,接着继续点分片下面定义的配置项的名称就可以获取到这个分片下面的配置信息内容了。而继承的使用相信从代码中大家也看出来了,parent 的 parent 配置项被 children 继承后,children 中不需要再定义这个配置项就可以直接获取到父级中定义过的这个配置项内容。而 children 中重写了 children 这个配置项,所以在 children 分片中的 children 配置项显示的就是它自己定义的内容。
检测配置信息是否存在
前面说过这个扩展中一共就两个方法,第二个就是用于检测配置项是否存在的一个方法,非常简单。
var_dump(Yaconf::has("test.foo")); // bool(true)
var_dump(Yaconf::has("test.baz")); // bool(false)
总结
说实话,这个配置扩展也并不是非常常见的一个扩展应用。因为大家目前在使用的框架不管是 Laravel 还是 TP 都会有它们自己的一套配置文件格式及操作。当然,如果说你是鸟哥的忠粉或者本身公司系统是架构在 Yaf 、Yac 、Yar 之上的话,那么加上这个 Yaconf 的话就可以看作是一整套完整的高性能内部扩展架构。它们主打的特点都是性能强悍,毕竟是从底层 C 扩展的角度来提供的框架,而不是通过 Composer 来使用 PHP 编写的框架。这个我们将来在学习和讲解框架的时候说不定会拿出来单独做一个系列哦!
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/01/source/11.一起了解PHP中YaConf扩展的使用.php
参考文档: