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 ZTSchar *base = (char *) mh_arg2;#elsechar *base;base = (char *) ts_resource(*((int *) mh_arg2));#endifht = (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

【php7扩展开发三】ini配置相关推荐

  1. php获取字符串扩展,PHP7扩展开发之字符串处理

    标签: 本文和大家分享的主要是PHP7扩展开发中字符串的处理相关知识,希望通过本文的分享能帮助大家更好的学习php. 这次,我们来看看字符串在PHP扩展里面如何处理. 示例代码如下: $len = s ...

  2. php7扩展开发教程,Linux下PHP7扩展开发入门教程1:扩展开发流程

    本文将会基于PHP7开发一个最简单的扩展,随便取个名learn_ext,编译生成一个learn_ext.so文件,最终调用可以在php中调用learn_ext扩展中的函数来输出一个hello worl ...

  3. php7扩展开发教程,Laravel 7 扩展开发教程

    下面由Laravel入门教程栏目给大家介绍Laravel 7 扩展开发教程,希望对需要的朋友有所帮助! 步骤 1. 创建一个新项目 我更喜欢使用 Laravel 安装程序.laravel new la ...

  4. 【php7扩展开发一】注册一个内部函数hello world

    通过扩展可以将C语言实现的函数提供给PHP脚本使用,如同大量PHP内置函数一样,这些函数统称为内部函数(internal function),与PHP脚本中定义的用户函数不同,它们无需精力用户函数的编 ...

  5. PHP7扩展开发(二):配置项与全局数值

    起步 Zend引擎提供了另种管理设置值(INI)的途径.现在弄个简单的,我们经常看到php.ini里有诸如 display_errors = On 这样的全局设置.假设我们需要为我们扩展定义一个值: ...

  6. 【php7扩展开发六】zval的操作

    生成各类型zval PHP7将变量的引用计数转移到了具体的value上,所以zval更多的是作为统一的传输格式,很多情况下只是临时性使用,比如函数调用时的传参,最终需要的数据是zval携带的zend_ ...

  7. 【php7扩展开发二】全局变量

    使用C语言开发程序时经常会使用全局变量进行数据存储,这就涉及前面已经介绍过的一个问题:线程安全,PHP设计了TSRM(即:线程安全资源管理器)用于解决这个问题,内核中频繁使用到的EG.CG等都是根据是 ...

  8. content_scripts css,chrome 扩展开发 中 content_scripts 配置的 文件没有执行?

    manifest 配置 { "name": "插件的名称", "version": "1.1.1", "des ...

  9. 【php7扩展开发五】函数调用

    实际应用中,扩展可能需要调用用户自定义的函数或者其他扩展定义的内部函数,PHP提供的函数调用API的使用: ZEND_API int call_user_function(HashTable *fun ...

最新文章

  1. Docker初学3:Docker的常用命令
  2. hdu 1053 Entropy (哈夫曼树)
  3. WeChat生成授权的token:md5(随机字符串+时间戳+盐值)
  4. python脚本批量生成数据
  5. 插图 引用 同一行两个插图_插图的目的
  6. 基于docker-compose的Gitlab CI/CD实践排坑指南
  7. c语言蓝牙接收6,终于搞定了通过两路蓝牙接收数据
  8. LwIP应用开发笔记之七:LwIP无操作系统HTTP服务器
  9. 【Elasticsearch】Elasticsearch 导入 导出 命令行工具
  10. 博文视点算法书单|让算法学习不再难
  11. Python实现对网易云音乐的数据进行一个数据清洗和可视化分析
  12. 圣思园【深入JVM】笔记-第一课-论学习方法
  13. 神经网络控制系统的特点,神经网络控制的优点
  14. OpenWrt配置阿里云动态域名服务DDNS
  15. Django中使用163邮箱发送邮件
  16. 史丰收速算-第五届蓝桥杯省赛
  17. 汇总|国内外优秀的计算机视觉团队
  18. PC上阅读电子书的软件:Sumatra PDF和calibre
  19. 数字孪生开发 数字孪生用什么软件实现
  20. 多媒体计算机维修记载,多媒体个人工作总结

热门文章

  1. linux在所有文件中查找某一个字符
  2. velocity学习(2)
  3. linux上设置git高亮
  4. 【一起去大厂系列】针对left join以及limit的两条优化小技巧
  5. 以下关于CISC和RISC的叙述中,错误的是()【最全!最详细总结!】
  6. 【GIF动画+完整可运行源代码】C++实现 选择排序——十大经典排序算法之二
  7. led大屏按实际尺寸设计画面_年会活动要用LED大屏还是投影?专业行家都是看这些数据。...
  8. python双向索引什么意思_python字典支持双向索引吗
  9. php 反射原理,PHP反射机制详解
  10. shell编程之条件语句(文件测试,test命令,字符串和逻辑测试,if单支语句,if双支语句,if多支语句,case命令,用if写跑步小实验)