起步

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扩展开发(二):配置项与全局数值相关推荐

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

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

  2. firefox扩展开发(二):用XUL创建窗口控件

    firefox扩展开发(二):用XUL创建窗口控件 2008-06-11 16:57 1.创建一个简单的窗口 <?xml version="1.0"?> <?xm ...

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

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

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

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

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

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

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

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

  7. 【php7扩展开发三】ini配置

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

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

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

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

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

最新文章

  1. Laravel 上使用 phpexcel的两种方式
  2. 关于生命、宇宙和万事万物的42个终极问题
  3. 其他系统 对外接口设计_领导:项目有个接口要对外开放,小张你来设计一下?...
  4. NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0环境配置
  5. 【原】TreeView+Checkbox级联操作(IE/FireFox测试通过)
  6. Git的smart Checkout\force checkout\Don‘t Checkout的区别
  7. 前端程序员容易忽视的一些基础知识
  8. TikZ绘图示例——尺规作图:直角的画法(一)
  9. 图论算法 最短路程_从网页排序看图论的重要应用
  10. Byobu:打造多任务的Terminal
  11. java hbase流量日志,Spark+Hbase 亿级流量分析实战(日志存储设计)
  12. Windows下安装并启动mongodb
  13. 数据分析工具有哪些类型
  14. FPGA杂记5——格雷码转换设计
  15. java调用数据库的基本步骤_java数据库操作基本流程和技巧
  16. 4.20 使用条件格式标识包含指定文本的单元格 [原创Excel教程]
  17. 2010年网页游戏全年数据统计
  18. 卡尔曼滤波/粒子滤波融合定位模拟器
  19. php配置北京时间,php如何设置北京时间_后端开发
  20. trinity运行原理及常见报错(四)

热门文章

  1. 恩平服务器维修,四月 2021 | EDUP
  2. C++ :sqlite3使用:
  3. 【图像分类】 图像分类中的对抗攻击是怎么回事?
  4. 【完结】AI1000问以后知识星球和B站见啦
  5. 我写的一个给time_t赋值的小函数
  6. 计算机小组作品,计算机兴趣小组小作品汇总.doc
  7. openresty开发系列15--lua基础语法4表table和运算符
  8. C# 往excel出力数据
  9. Python实用笔记 (2)list和tuple
  10. p,br,hn,b,i,u,s,sup,sub标签