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

static inline String ini_get(String varname)

{

char *value = zend_ini_string((char *) varname.c_str(), (uint)

varname.length(), 0);

if (!value)

{

return "";

}

return value;

}

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

[catx]

catx.abc = "hello"

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

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

ZEND_INI_BEGIN()

ZEND_INI_ENTRY("catx.abc", "hi", PHP_INI_ALL, NULL)

ZEND_INI_END()

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

#define ZEND_INI_BEGIN() static const zend_ini_entry_def ini_entries[] =

{

#define ZEND_INI_ENTRY(name, default_value, modifiable, on_modify) \

ZEND_INI_ENTRY_EX(name, default_value, modifiable, on_modify, NULL)

#define ZEND_INI_ENTRY_EX(name, default_value, modifiable, on_modify,

displayer) \

ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, NULL, NULL,

NULL, displayer)

#define ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify,

arg1, arg2, arg3, displayer) \

{ name, on_modify, arg1, arg2, arg3, default_value, displayer, modifiable,

sizeof(name)-1, sizeof(default_value)-1 },

#define ZEND_INI_END() { NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0}

};

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

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

#define REGISTER_INI_ENTRIES() zend_register_ini_entries(ini_entries,

module_number)

#define UNREGISTER_INI_ENTRIES()

zend_unregister_ini_entries(module_number)

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

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

typedef struct _zend_ini_entry_def {

const char *name;

ZEND_INI_MH((*on_modify));

void *mh_arg1;

void *mh_arg2;

void *mh_arg3;

const char *value;

void (*displayer)(zend_ini_entry *ini_entry, int type);

int modifiable;

uint name_length;

uint value_length;

} 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

struct IniEntry {

std::string name;

std::string default_value;

int modifiable;

};

// modifiable can be one of

these:PHP_INI_SYSTEM/PHP_INI_PERDIR/PHP_INI_USER/PHP_INI_ALL

void addIniEntry(const char* name, const char* default_value = "", int

modifiable = PHP_INI_ALL)

{

IniEntry entry;

entry.name = name;

entry.default_value = default_value;

entry.modifiable = modifiable;

ini_entries.push_back(entry);

}

protected:

std::vector ini_entries;

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

void Extension::registerIniEntries(int module_number) {

if (!ini_entries.size()) {

return;

}

zend_ini_entry_def* entry_defs = new zend_ini_entry_def[ini_entries.size()

+ 1];

for (auto i = 0; i < ini_entries.size(); ++i) {

IniEntry& entry = ini_entries[i];

zend_ini_entry_def def = {

entry.name.c_str(), // name

NULL, // on_modify

NULL, // mh_arg1

NULL, // mh_arg2

NULL, // mh_arg3

entry.default_value.c_str(), // value

NULL, // displayer

entry.modifiable, // modifiable

(uint)entry.name.size(), // name_length

(uint)entry.default_value.size(), // value_length

};

entry_defs[i] = def;

}

memset(entry_defs + ini_entries.size(), 0, sizeof(*entry_defs));

zend_register_ini_entries(entry_defs, module_number);

delete []entry_defs;

}

当MSHUTDOWN的时候一键卸载:

void Extension::unregisterIniEntries(int module_number) {

if (ini_entries.size()) {

zend_unregister_ini_entries(module_number);

}

}

这样就搞定ini了~

今天就给大家讲这么多吧,php作为开发类的一个语言,现在受到越来越多人的关注,选择合肥达内PHP培训,不再孤军奋战,轻轻松松做IT高薪白领。合肥达内培训带领有明确目标的学子迈向成功之路!

【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!

合肥达内培训php,合肥达内PHP培训php7扩展声明与获取ini配置相关推荐

  1. 合肥达内培训php,合肥达内PHP培训PHP安全模式

    php安全模式:safe_mode=on|off 启用safe_mode指令将对在共享环境中使用PHP时可能有危险的语言特性有所限制.可以将safe_mode是指为布尔值on来启用,或者设置为off和 ...

  2. 合肥php开发培训费用,合肥PHP开发培训之PHP文件基础操作

    文件的基本操作:(更多) fopen():文件打开 $file = fopen("file.txt","r+"); fopen()函数的参数是目标文件的路径和文 ...

  3. 培训python合肥

    如今,从顶级金融机构到最小的大数据创业公司,各行各业.各种规模的机构都在使用Python编程语言支撑业务运作.它还位列2018推荐学习前3的编程语言.在一线城市,一名具备Python编程能力的数据工程 ...

  4. 达内筑巢,引国际学员培训深造

    [本报讯] 2012年5月23日晚间,正值达内十二期CEO咨询日火热举行,毕业于华北电力大学自动化专业的Sydney同学来达内咨询高端IT培训课程.据悉,Sydney来自于喀麦隆,现在从华北电力大学刚 ...

  5. 以IT培训起家的达内科技,如今半壁江山是非IT培训的其他职业教育了

    以IT培训起家的达内科技,如今半壁江山是非IT培训的其他职业教育了 以IT培训起家的达内科技,如今半壁江山是非IT培训的其他职业教育了 posted on 2016-07-27 12:29  lexu ...

  6. 初中数学老师计算机培训反思,初中数学老师培训心得体会优秀范文五篇

    历史是时代的见证,真理的火炬,记忆的生命,生活的老师和古人的使者.今天小编为大家带来的是初中数学老师培训心得体会优秀范文,希望可以帮助到大家. 初中数学老师培训心得体会优秀范文一 我有幸成为某某市第某 ...

  7. 达内python培训费_达内python的费用是多少?学习时间长吗?

    在人工智能开启的时代,Python作为人工智能的首选语言,学习它的人会越来越多.对于想学习Python的人员来说,Python培训费用是最关心的问题,python培训班大概多少费用呢? 目前来讲,Py ...

  8. 达内java作业_【达内JAVA教程】达内Java基础题

    原标题:[达内JAVA教程]达内Java基础题 [达内JAVA教程]达内Java基础题.的小编收集了四道JAVA基础题,下面快来跟随的小编来了解一下吧! 话说很多java程序员学过一段时间后,都应该找 ...

  9. 线上学python哪家好-Python线下培训好还是线上培训好

    原标题:Python线下培训好还是线上培训好 五年前培训的话,只要培训出来就有工作,因为那个时候国家缺少这个岗位,大肆宣传.所以那个时候是批量生产,培训学点,到公司有人带. 但是现在不缺人,缺的是人才 ...

最新文章

  1. 各领域机器学习数据集汇总
  2. React.js 小书 Lesson12 - state vs props
  3. 360脱壳-native函数还原笔记-2017-06-25
  4. 忘记目标 潜心做事([日] 端河光二)
  5. javascript构造函数继承
  6. MySQL中的+作用,进行字符串的拼接用concat
  7. php公司共享 管理,php – 管理几个共享重叠函数和类的代码库
  8. Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 二分
  9. 笔记︱虚拟变量回归=差异显著(方差分析)+差异量化(系数值)
  10. 深入浅出Linux设备驱动编程--引言
  11. Web前端开发技术实验与实践(第3版)储久良 实训12
  12. 电脑telnet失败的解决方法
  13. 【OC】线性二次型(LQR)性能指标最优控制(1)
  14. 从openssl rsa pem文件中提取公私钥数据实现
  15. 针对LSB 信息隐藏的卡方分析算法实现
  16. mysql统计缺勤的天数_缺勤天数统计的处理示例.sql
  17. TCP非持久连接、持久性连接(流水线方式、非流水线方式)例题
  18. 树莓派学习(一) 如何 关机 重启
  19. ARM架构Generic Interrupt Controller(GIC)之Distributor和CPU interface功能介绍
  20. css画横线箭头_css 画带边框的箭头的问题

热门文章

  1. 耗时162天,从华为外包5k转岗正式员工15k,经历的心酸只有自己知道····
  2. ETF套利“三大技法”
  3. 移动端文字与排版设计的六个原则
  4. PHP中虚拟主机的配置
  5. RTFSC - Read The Fucking Source Code
  6. 目前国内最好的FLASH社区
  7. Linux上的集成开发环境
  8. 一道面试题引出的系列数据库性能,数据安全问题及解决方案
  9. ubuntu16.04+惠普光影精灵+GTX960M+英伟达驱动安装
  10. springboot+vue项目大型实战(一)后端开发