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

本文探讨了在PHP扩展中如何使用ini配置和全局变量。通过定义线程安全的全局变量并结合ini配置,实现了动态配置的可能性。介绍了PHP_INI_ENTRY和STD_PHP_INI_ENTRY宏的作用,以及如何在代码中访问这些配置和全局变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值