php扩展开发-全局变量

//php_myext.h
ZEND_BEGIN_MODULE_GLOBALS(myext) unsigned
long counter;//在这里定义需要的全局变量,可以多个,每个变量一行, ZEND_END_MODULE_GLOBALS(myext)
//这个宏展开之后,实际上就是定义了一个结构体,用来保存每一个全局变量 //这是一个固定写法,你几乎会在每一个扩展里都能看到它的存在,它的作用是封装全局变量的调用,让它能够同时兼任线程安全和非线程安全两个环境 #ifdef ZTS
#define MYEXT_G(v) TSRMG(myext_globals_id, zend_myext_globals *, v)//myext和MYEXT是扩展名称的大小写,不同的扩展有着不一样的名字 #else #define MYEXT_G(v) (myext_globals.v)//同上 #endif //php_myext.h 以上这些都是在.h文件中
//myext.c
//定义一个上面提到的结构体的变量,用来保存全局变量的数据 ZEND_DECLARE_MODULE_GLOBALS(myext); zend_module_entry myext_module_entry
= { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif "myext",//扩展名称 myext_functions,//zend_function_entry myext_functions 定义好的函数扩展变量 PHP_MINIT(myext),//MINIT_FUNCTION NULL,//MSHUTDOWN_FUNCTION PHP_RINIT(myext),//RINIT_FUNCTION//加入PHP_RINIT函数 NULL,//RSHUTDOWN_FUNCTION PHP_MINFO(myext),//MINFO_FUNCTION #if ZEND_MODULE_API_NO >= 20010901 PHP_MYEXT_VERSION, #endif STANDARD_MODULE_PROPERTIES };

  PHP_MINIT_FUNCTION(myext)
  {

  ZEND_INIT_MODULE_GLOBALS(myext, NULL,NULL);//分配一个线程安全的资源id,你可以不用关心它的具体实现,总之用来保存在线程安全中的全局变量。

return SUCCESS;
}
//在每个页面请求时,都是加载这个函数,利用这个特性,来初始化全局变量的值。 PHP_RINIT_FUNCTION(myext) { MYEXT_G(counter)
= 0; return SUCCESS; }

到现在为止,我们就定义了一个全局变量counter,接着我们将在函数里使用这个变量

//php_myext.h
PHP_FUNCTION(myext_example_global)
//函数注册 PHP_FE(myext_example_global, NULL)
//每个函数一行,第一个参数与PHP_FUNCTION(name)的name一样 //函数定义 PHP_FUNCTION(myext_example_global) { MYEXT_G(counter)++; RETURN_LONG(MYEXT_G(counter)); }
/*

var_dump(myext_example_global());
var_dump(myext_example_global());

//你会看到同一次请求中,每次函数调用,counter的数量不断累加,但是每一次的请求,结果都是一样,这就是刚才提到的RINIT函数的作用


int(1)
int(2)

*/
原文地址:https://www.cnblogs.com/wuhen781/p/6240164.html