php7扩展声明与获取ini配置

今天在开发PHP扩展中遇到了获取ini配置的需求,采用如下的方法获取发现得到的是空值:

在ini文件中我是这样配置的:

经过谷歌搜索,发现了这篇博客介绍了INI的使用方式,发现ini是需要先声明才能获取的。

通常的用法,是先通过下面的宏定义一个INI数组:

通过查看Zend源码,其对应展开如下:

其实就是定义了一个zend_ini_entry_def的数组,其名字固定叫做ini_entries,里面每一项是要注册的INI配置。

上面的宏定义,无论你是在函数里还是全局作用域定义都是可以的,但是还需要主动注册到zend里去,通常用下面的2个宏来搞定:

上述宏默认就会找ini_entries变量传进去,第二个参数module_number你可以在扩展的MINIT和MSHUTDOWN两个函数的回调参数里得到,所以REGISTER_INI_ENTRIES要在MINIT里调用,后者在MSHUTDOWN里调用用于销毁注册的INI配置。

再就是关注一下zend_ini_entry_def的定义:

name是ini配置的key,value是默认值(也就是ini里没配置时候的值),mh_arg1-3是用户可以指定的上下文参数(主要是用来displayer和on_modify回调时候提供上下文),modifiable是限制是否可以通过ini_set来修改ini配置,name_length是name的长度,value_length是value的长度。

on_modify和displayer没必要用,通过php代码ini_set修改变量可以直接反应到zend_ini_string的结果中,这些回调函数只是给你一个主动通知机制,一般是用不到的。

因为PHP-X项目是C++封装的Zend api,所以没法直接用上面的宏来搞定这些事情,因此需要绕过宏直接与Zend api交互:

通过上述接口,允许用户添加若干ini配置,当MINIT回调的时候一股脑给它注册上去:

当MSHUTDOWN的时候一键卸载:

这样就搞定ini了~

后续会陆续把PHP扩展开发中的一些知识点补充到博客上来。

另外教大家个办法,如果发现Zend api不熟悉、没有博客、没有文档说明的话,可以去github上搜api的名字(会罗列出所有使用该api的项目),或者去php源码的ext目录下看其他成熟扩展是怎么用的,屡试不爽。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~