关于php扩展中使用ini配置和使用全局变量

来源:互联网 发布:wifi万能钥匙源码 编辑:程序博客网 时间:2024/05/13 22:28

关于php扩展中使用ini配置和使用全局变量。有时候一段程序逻辑的方向修改,可以根据输入的数据进行修改,也可以直接去更改代码,但这样带来了灵活性的缺失和安全的问题,所以引入了php.ini配置文件,为了方便提供在ini里面配置。下面配置该全局。
首先,确定该全局变量是不是线程安全的(因为一个线程里面可能会提供多个request,考虑到数据共享带来的风险),主要下是否需要include “TSRM.h”。
好了,直接上码

ZEND_BEGIN_MODULE_GLOBALS(ext)    long counter;    zend_bool direction;ZEND_END_MODULE_GLOBALS(ext)

上面就定义了2个全局变量,一个counter,direction。分别是long、bool型。其实就是定义了一个全局变量的结构体,改结构体的名称是:zend_ext_globals,里面有2个成员,分别是counter,direction。
假设是在线程安全的环境下使用,所以还是定义如下内容:

#ifdef ZTS#define EXT_G(v) TSRMG(ext_globals_id, zend_ext_globals *, v)#else#define EXT_G(v) (ext_globals.v)#endif

ok,再来看一下怎么把这个全局变量的结构体和ini文件关联,直接上码:

PHP_INI_BEGIN()    PHP_INI_ENTRY("ext.greeting", "This is a glboal val", PHP_INI_ALL, NULL)    STD_PHP_INI_ENTRY("ext.direction", "1", PHP_INI_ALL, OnUpdateBool, direction, zend_ext_globals, ext_globals)PHP_INI_END()

这里解释一下,
PHP_INI_ENTRY 是注册一个ini配置的配置项,下面分别说一下里面的参数:
1、这个配置项是在ext扩展下,名称是greeting。
2、这是1的值。
3、PHP_INI_ALL 说明这个ini的值的权限,意在这个值是可以在任何地方修改的。
4、可以是个回调函数,当修改这个值的时候触发,比如使用ini_set的时候。
STD_PHP_INI_ENTRY和PHP_INI_ENTRY类似,前三项的值的意义和PHP_INI_ENTRY,但提供了一些额外功能。:
1、同PHP_INI_ENTRY。
2、同上。
3、同上。
4、这里说一下,我们知道ini是通过配置文件配置的,也就是说读取的来源于文件,对于文件内容,只能是string型,不管你在文件里面配置的是布尔值、数值型,在内核里面,读出来就是string。所以,如果你配置的是数值或者布尔值的时候,肯定在使用的时候也希望它是布尔值或者数值型而不是字符型。那咋办?没关系,zend提供了一个方法,就是在你取出的ini值里面可以各种转换类型。比如上面的第四个参数OnUpdateBool,功能就像它的名字一样,把取出来的值转成bool类型。
5、这个全局变量的命,其实就是在全局结构体里面的成员变量名。
6、zend_ext_globals是结构体名称,在上面定义过的。
7、定义的结构体名称,就是这样:zend_ext_globals *ext_globals。

OK,到了这里,基本的东西搞定了,看一下怎么使用,
首先,要使用ini的值,值需要这样:INI_STR(ext.direction)
如果要使用定义好的全局变量呢?这样:EXT_G(ext.greeting)

暂时到这里,后面考虑给出更详细的例子。

0 0
原创粉丝点击