【php7扩展开发三】ini配置

php.ini配置
php.ini是PHP主要的配置文件,解析时PHP将在这些地方依次查找该文件:当前工作目录、环境变量PHPRC指定目录、编译时指定的路径,在命令行模式下,php.ini的查找路径可以用-c 参数替代。

该文件的语法非常简单: 配置标识符 = 值 。空白字符和用分号';'开始的行被忽略,[xxx]行也被忽略;配置标识符大写敏感,通常会用'.'区分不同的节;值可以是数字、字符串、PHP常量、位运算表达式。

关于php.ini的解析过程不作介绍,只从应用的角度介绍如何在一个扩展中获取一个配置项,通常会把php.ini的配置映射到一个变量,从而在使用时直接读取那个变量,也就是把所有的配置转化为了C语言中的变量,扩展中一般会把php.ini配置映射到上一篇介绍的全局变量(资源)https://blog.csdn.net/rorntuck7/article/details/86089246,要想实现这个转化需要在扩展中为每一项配置设置映射规则:

PHP_INI_BEGIN()
//每一项配置规则
...
PHP_INI_END()

这两个宏实际只是把各配置规则组成一个数组,配置规则通过 STD_PHP_INI_ENTRY() 设置:

STD_PHP_INI_ENTRY(name,default_value,modifiable,on_modify,property_name,struct_type,struct_ptr)
  • name: php.ini中的配置标识
  • __default_value:__ 默认值,注意不管转化后是什么类型,这里必须设置为字符
  • modifiable:可修改等级,ZEND_INI_USER为可以在php脚本中修改,ZEND_INI_SYSTEM为可以在php.ini中修改,还有一个ZEND_INI_PERDIR,ZEND_INI_ALL表示三种都可以,通常情况下设置为ZEND_INI_ALL、ZEND_INI_SYSTEM即可
  • __on_modify:__函数指针,用于指定发现这个配置后赋值处理的函数,默认提供了5个:OnUpdateBool、OnUpdateLong、OnUpdateLongGEZero、OnUpdateReal、OnUpdateString、OnUpdateStringUnempty,支持可以自定义
  • __property_name:__ 要映射到的结构struct_type中的成员
  • __struct_type:__ 映射结构的类型
  • struct_ptr:__ 映射结构的变量地址,发现配置

比如将php.ini中的 mytest.opene_cache 值映射到 MYTEST_G() 结构中的open_cache,类型为zend_long,默认值109,则可以这么定义:

PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("mytest.open_cache", "109", PHP_INI_ALL, OnUpdateLong, open_cache, zend_mytest_globals, mytest_globals)
PHP_INI_END();

如果PHP提供的几个on_modify不能满足需求可以自定义on_modify函数,举个例子:将php.ini中的配置 mytest.class 插入MYTESY_G(class_table)哈希表,则可以在扩展中定义这样一个on_modify: ZEND_INI_MH(OnUpdateAddArray) ,将php.ini映射到全局变量的完整代码:

//php_mytest.h
#define MYTEST_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(mytest, v)
ZEND_BEGIN_MODULE_GLOBALS(mytest)
	zend_long open_cache;
	HashTable class_table;
ZEND_END_MODULE_GLOBALS(mytest)
//自定义on_modify函数
ZEND_API ZEND_INI_MH(OnUpdateAddArray);
//mytest.c
ZEND_DECLARE_MODULE_GLOBALS(mytest)

PHP_INI_BEGIN()
	STD_PHP_INI_ENTRY("mytest.open_cache", "109", PHP_INI_ALL, OnUpdateLong, open_cache, zend_mytest_globals, mytest_globals)
	STD_PHP_INI_ENTRY("mytest.class", "stdClass", PHP_INI_ALL, OnUpdateAddArray, class_table, zend_mytest_globals, mytest_globals)
PHP_INI_END()

ZEND_API ZEND_INI_MH(OnUpdateAddArray)
{
	HashTable *ht;
	zval val;
	
	#ifndef ZTS
		char *base = (char *) mh_arg2;
	#else
		char *base;
		base = (char *) ts_resource(*((int *) mh_arg2));
	#endif
	
	ht = (HashTable*)(base+(size_t) mh_arg1);
	ZVAL_NULL(&val);
	zend_hash_add(ht, new_value, &val);
}

PHP_MINIT_FUNCTION(mytest)
{
	zend_hash_init(&MYTEST_G(class_table), 0, NULL, NULL, 1);//将php.ini解析到指定结构体
	REGISTER_INI_ENTRIES();
	printf("open_cache %d\n", MYTEST_G(open_cache));
}

zend_module_entry mytest_module_entry = {
	STANDARD_MODULE_HEADER,
	"mytest",
	NULL,//mytest_functions,
	PHP_MINIT(mytest),
	NULL,//PHP_MSHUTDOWN(mytest),
	NULL,//PHP_RINIT(mytest),
	NULL,//PHP_RSHUTDOWN(mytest),
	NULL,//PHP_MINFO(mytest),
	"1.0.0",
	STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_TIMEOUT
#ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
#endif
ZEND_GET_MODULE(mytest)
#endif

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值