在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
php.ini文件是用来保存各项扩展配置的文件,每个扩展都或多或少需要有一个定制化的配置,ini文件是一个很好的保存配置的方式,我们来看下怎么在自己的扩展里,使用到ini的配置功能 //创建ini的配置项 ZEND_INI_MH(myext_example_ini_callback){ /* var_dump(ini_get('myext.ini_string')); string(21) "我是ini的字符串" */
我们来看一下刚才PHP_INI_ENTRY函数中第三个参数作用域的问题
怎么能在扩展中访问ini的配置项呢 PHP_FUNCTION(myext_example_ini);//php_myext.c PHP_FE(myext_example_ini, NULL)//每个函数一行,第一个参数与PHP_FUNCTION(name)的name一样 PHP_FUNCTION(myext_example_ini){ const char * ini_string = INI_STR("myext.ini_string");//获取当前值 long ini_long = INI_INT("myext.ini_long"); php_printf("ini_string => %s\n",ini_string); php_printf("ini_long => %ld\n",ini_long); const char * orig_ini_string = INI_ORIG_STR("myext.ini_string");//获取默认值 long orig_ini_long = INI_ORIG_INT("myext.ini_long"); php_printf("orig_ini_string => %s\n",orig_ini_string); php_printf("orig_ini_long => %ld\n",orig_ini_long); } myext_example_ini();
ini_string => 我是ini的字符串 //上面是修改前,下面是修改后 ini_string => 我是新的INI字符串
INI的配置项一共有四种类型,所有INI_STR和INI_ORIG_STR分别有四种不同类型的组合 #define INI_INT(name) zend_ini_long((name), sizeof(name), 0) #define INI_FLT(name) zend_ini_double((name), sizeof(name), 0) #define INI_STR(name) zend_ini_string_ex((name), sizeof(name), 0, NULL) #define INI_BOOL(name) ((zend_bool) INI_INT(name)) #define INI_ORIG_INT(name) zend_ini_long((name), sizeof(name), 1) #define INI_ORIG_FLT(name) zend_ini_double((name), sizeof(name), 1) #define INI_ORIG_STR(name) zend_ini_string((name), sizeof(name), 1) #define INI_ORIG_BOOL(name) ((zend_bool) INI_ORIG_INT(name)) 在PHP_INI_ENTRY函数中第四个参数是一个回调函数,在ini配置项被修改的时候,这个函数会被调用,这个的作用在于,你可以对设置的值进行过滤,不符合要求的可以返回FAILER让本次修改不生效。 ZEND_INI_MH(myext_example_ini_callback){//这个函数需要用ZEND_INI_MH来定义,跟ZEND_FUNCTION不一样
if(new_value_length == 0 || strcmp(new_value,"no_allow_string") == 0)//如果字符串为空或字符串=no_allow_string就不允许设置 我们经常需要通过phpinfo或php -i来查询当前有效的ini配置项目,所以当我们开发扩展的时候,最好也把当前配置的信息写到PHP_MINFO_FUNCTION的函数中,结合前面说的MINFO部分的知识,以及刚才说到读取INI配置项的知识,我们可以自己实现这个功能,幸运的是,Zend的内核以及帮我们考虑到了,所有我们只要用以下代码就可以做到了。 PHP_MINFO_FUNCTION(myext){ php_info_print_table_start(); php_info_print_table_row(2, "version", PHP_MYEXT_VERSION); php_info_print_table_row(2, "writer", "zhangxiaomin"); php_info_print_table_end(); DISPLAY_INI_ENTRIES();//只要增加这一行就可以了/ } myext version => 1.0 Directive => Local Value => Master Value
到目前为止,我们已经能够在扩展中使用ini的配置了,但是实现起来不太理想,内核是用一个哈希表来保存配置项的数据的,每一次都需要一直zend_hash_find,然后保存的值都是字符串类型,查找到之后需要做类型转换,我们有什么方法来优化吗?如果你能想起全局变量,那就说明你慢慢对扩展有点感觉了。 ZEND_BEGIN_MODULE_GLOBALS(myext) unsigned long counter; char * global_ini_string; char * global_ini_long; ZEND_END_MODULE_GLOBALS(myext) PHP_INI_BEGIN() PHP_INI_ENTRY("myext.ini_string","我是ini的字符串",PHP_INI_ALL,myext_example_ini_callback) PHP_INI_ENTRY("myext.ini_long","100",PHP_INI_ALL,NULL) STD_PHP_INI_ENTRY("myext.global_ini_string","i am global_ini_string",PHP_INI_ALL,OnUpdateString, global_ini_string, zend_myext_globals, myext_globals) STD_PHP_INI_ENTRY("myext.global_ini_long","10000",PHP_INI_ALL,OnUpdateLong, global_ini_long, zend_myext_globals, myext_globals) PHP_INI_END() PHP_FUNCTION(myext_example_ini){ const char * ini_string = INI_STR("myext.ini_string"); long ini_long = INI_INT("myext.ini_long"); php_printf("ini_string => %s\n",ini_string); php_printf("ini_long => %ld\n",ini_long); const char * orig_ini_string = INI_ORIG_STR("myext.ini_string"); long orig_ini_long = INI_ORIG_INT("myext.ini_long"); php_printf("orig_ini_string => %s\n",orig_ini_string); php_printf("orig_ini_long => %ld\n",orig_ini_long); php_printf("global_ini_string => %s\n",MYEXT_G(global_ini_string)); php_printf("global_ini_long => %ld\n",MYEXT_G(global_ini_long)); } /* 这个地方有点问题,会导致php段错误,回头再查一下 */
|
2022-07-29
2022-08-17
2022-11-06
2022-08-18
2022-08-16
请发表评论