PHP7扩展开发(二):配置项与全局数值
起步
Zend引擎提供了另种管理设置值(INI)的途径。现在弄个简单的,我们经常看到php.ini里有诸如 display_errors = On
这样的全局设置。假设我们需要为我们扩展定义一个值: hello.greeting
并用函数 hello_ini()
返回它的内容。
在php.ini:
[hello]
hello.greeting=1
为了避免命名空间的冲突,我们扩展的名字作为所有值的前缀。仅仅是一种约定,一个句点用来分隔扩展名和说明性的初始设定名字。
声明变量 php_hello.h
用ext_skel
工具初始化的扩展有个好处就是它能帮我们在特定的位置写上注释。
/*Declare any global variables you may need between the BEGINand END macros here:ZEND_BEGIN_MODULE_GLOBALS(hello)zend_long global_value;char *global_string;
ZEND_END_MODULE_GLOBALS(hello)
*/
这是说如果我们需要声明全局变量,需要将放置在 宏
BEBIN与END之间。并提供了示例,因此在这边添加:
ZEND_BEGIN_MODULE_GLOBALS(hello)zend_long greeting;
ZEND_END_MODULE_GLOBALS(hello)
ZEND_BEGIN_MODULE_GLOBALS()
和ZEND_END_MODULE_GLOBALS()
用来创建一个名为zend_hello_globals
的结构,它包含一个long型的变量。然后有条件地将HELLO_G()
定义为从线程池中取得数值,或者从全局作用域中得到-如果你编译的目标是非多线程环境。
工具还为我生成了:
/* Always refer to the globals in your function as HELLO_G(variable).You are encouraged to rename these macros something shorter, seeexamples in any other php module directory.
*/
#define HELLO_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(hello, v)#if defined(ZTS) && defined(COMPILE_DL_HELLO)
ZEND_TSRMLS_CACHE_EXTERN()
#endif#endif
这是一个简化变量获取操作的宏设置,可以使用 HELLO_G(greeting)
来获得全局设置的变量。
源码实现 hello.c
/* {{{ PHP_INI*/
/* Remove comments and fill if you need to have entries in php.ini
PHP_INI_BEGIN()STD_PHP_INI_ENTRY("hello.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_hello_globals, hello_globals)STD_PHP_INI_ENTRY("hello.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_hello_globals, hello_globals)
PHP_INI_END()
*/
/* }}} */
注释说明可以自己看一下,在这下方添加:
ZEND_DECLARE_MODULE_GLOBALS(hello)PHP_INI_BEGIN()STD_PHP_INI_ENTRY("hello.greeting","0", PHP_INI_ALL, OnUpdateLong, greeting, zend_hello_globals, hello_globals)
PHP_INI_END()
用ZEND_DECLARE_MODULE_GLOBALS()
宏来例示zend_hello_globals
结构.初始值 "0"
是在php.ini里没有对应实体的时候生效的。
全局初始函数:
static void php_hello_init_globals(zend_hello_globals *hello_globals)
{//hello_globals->global_value = 0;//hello_globals->global_string = NULL;
}
php_hello_init_globals()
实际上什么也没做,却得多声明个RINIT将变量greeting初始化为0,为什么?
关键在于这两个函数何时调用。php_hello_init_globals()只是在一个新的进程或线程时被调用;然而,每个进程都能处理多个请求,所以这个函数将变量初始化为0将只在第一个页面请求时运行。
接下来就是hello_ini()函数的实现了:
PHP_FUNCTION(hello_ini)
{RETURN_LONG(HELLO_G(greeting));
}const zend_function_entry hello_functions[] = {PHP_FE(hello, NULL)PHP_FE(hello_ini, NULL) /*添加到编译中去*/PHP_FE(confirm_hello_compiled, NULL)PHP_FE_END
};
一些诸如PHP_MINIT_FUNCTION
也要修改,这些函数目前不知道作用是什么:
PHP_MINIT_FUNCTION(hello)
{REGISTER_INI_ENTRIES();return SUCCESS;
}PHP_MSHUTDOWN_FUNCTION(hello)
{UNREGISTER_INI_ENTRIES();return SUCCESS;
}
修改配置
写个hello_change_ini()
来修改配置项:
PHP_FUNCTION(hello_change_ini)
{HELLO_G(greeting) ++;
}
同样要加到 hello_functions[]
中。
测试
<?php
echo hello_ini(); //1
hello_change_ini();
echo "<br>";
echo hello_ini(); //2
PHP7扩展开发(二):配置项与全局数值相关推荐
- 【php7扩展开发二】全局变量
使用C语言开发程序时经常会使用全局变量进行数据存储,这就涉及前面已经介绍过的一个问题:线程安全,PHP设计了TSRM(即:线程安全资源管理器)用于解决这个问题,内核中频繁使用到的EG.CG等都是根据是 ...
- firefox扩展开发(二):用XUL创建窗口控件
firefox扩展开发(二):用XUL创建窗口控件 2008-06-11 16:57 1.创建一个简单的窗口 <?xml version="1.0"?> <?xm ...
- php获取字符串扩展,PHP7扩展开发之字符串处理
标签: 本文和大家分享的主要是PHP7扩展开发中字符串的处理相关知识,希望通过本文的分享能帮助大家更好的学习php. 这次,我们来看看字符串在PHP扩展里面如何处理. 示例代码如下: $len = s ...
- php7扩展开发教程,Linux下PHP7扩展开发入门教程1:扩展开发流程
本文将会基于PHP7开发一个最简单的扩展,随便取个名learn_ext,编译生成一个learn_ext.so文件,最终调用可以在php中调用learn_ext扩展中的函数来输出一个hello worl ...
- php7扩展开发教程,Laravel 7 扩展开发教程
下面由Laravel入门教程栏目给大家介绍Laravel 7 扩展开发教程,希望对需要的朋友有所帮助! 步骤 1. 创建一个新项目 我更喜欢使用 Laravel 安装程序.laravel new la ...
- 【php7扩展开发六】zval的操作
生成各类型zval PHP7将变量的引用计数转移到了具体的value上,所以zval更多的是作为统一的传输格式,很多情况下只是临时性使用,比如函数调用时的传参,最终需要的数据是zval携带的zend_ ...
- 【php7扩展开发三】ini配置
php.ini配置 php.ini是PHP主要的配置文件,解析时PHP将在这些地方依次查找该文件:当前工作目录.环境变量PHPRC指定目录.编译时指定的路径,在命令行模式下,php.ini的查找路径可 ...
- 【php7扩展开发一】注册一个内部函数hello world
通过扩展可以将C语言实现的函数提供给PHP脚本使用,如同大量PHP内置函数一样,这些函数统称为内部函数(internal function),与PHP脚本中定义的用户函数不同,它们无需精力用户函数的编 ...
- 【php7扩展开发五】函数调用
实际应用中,扩展可能需要调用用户自定义的函数或者其他扩展定义的内部函数,PHP提供的函数调用API的使用: ZEND_API int call_user_function(HashTable *fun ...
最新文章
- Laravel 上使用 phpexcel的两种方式
- 关于生命、宇宙和万事万物的42个终极问题
- 其他系统 对外接口设计_领导:项目有个接口要对外开放,小张你来设计一下?...
- NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0环境配置
- 【原】TreeView+Checkbox级联操作(IE/FireFox测试通过)
- Git的smart Checkout\force checkout\Don‘t Checkout的区别
- 前端程序员容易忽视的一些基础知识
- TikZ绘图示例——尺规作图:直角的画法(一)
- 图论算法 最短路程_从网页排序看图论的重要应用
- Byobu:打造多任务的Terminal
- java hbase流量日志,Spark+Hbase 亿级流量分析实战(日志存储设计)
- Windows下安装并启动mongodb
- 数据分析工具有哪些类型
- FPGA杂记5——格雷码转换设计
- java调用数据库的基本步骤_java数据库操作基本流程和技巧
- 4.20 使用条件格式标识包含指定文本的单元格 [原创Excel教程]
- 2010年网页游戏全年数据统计
- 卡尔曼滤波/粒子滤波融合定位模拟器
- php配置北京时间,php如何设置北京时间_后端开发
- trinity运行原理及常见报错(四)
热门文章
- 恩平服务器维修,四月 2021 | EDUP
- C++ :sqlite3使用:
- 【图像分类】 图像分类中的对抗攻击是怎么回事?
- 【完结】AI1000问以后知识星球和B站见啦
- 我写的一个给time_t赋值的小函数
- 计算机小组作品,计算机兴趣小组小作品汇总.doc
- openresty开发系列15--lua基础语法4表table和运算符
- C# 往excel出力数据
- Python实用笔记 (2)list和tuple
- p,br,hn,b,i,u,s,sup,sub标签