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) = ; 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)
*/
php扩展开发-全局变量的更多相关文章
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- PHP扩展开发相关总结
1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, ...
- PHP扩展开发教程(总结)
PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工 ...
- 【原创】PHP扩展开发进阶
PHP扩展开发进阶 作者:wf (360电商技术) 在第一期PHP扩展开发入门中,简单的介绍了PHP的总体架构和执行机制,并具体说明了怎样开发和编译一个主要的PHP扩展,最后在PHP 5.3的环境下 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)
今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...
- 关于PHP扩展开发(收藏)
一.Linux shell命令: ls –lh 查看文件大小 du –a 查看文件及文件夹大小 -------------------------- nginx ------------- ...
- postgres扩展开发
扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...
- 【转发】NPAPI学习(Firefox和Chrome扩展开发 )
NPAPI学习(Firefox和Chrome扩展开发 ) 2011-11-08 14:41:02 by [6yang], 1172 visits, 收藏 | 返回 Firefox和Chrome扩展开发 ...
随机推荐
- DO、PO、BO、DTO、VO等概念
PO 全称为:Persistant Object,持久化对象,与数据库结构映射的实体,数据库中的一条数据即为一个 PO 对象. BO 全称为:Business Object,业务对象,主要作用是把业务 ...
- 栈队列例题2:SetOfStack放盘子
代码如下: import java.util.ArrayList; import java.util.Scanner; public class SetOfStack { public static ...
- 深入理解java虚拟机阅读笔记(1)运行时数据区域
java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...
- Flask文件目录----- db文件
import sqlite3 import click from flask import current_app, g from flask.cli import with_appcontext d ...
- select标签使用 三目运算符
<td> <select id="roleName" name="roleName" class="input" styl ...
- dedecms无法下载远程jpeg图片 织梦不能提取文章内容中的jpeg图片生成缩略图
文件:/dede/inc/inc_archives_functions.php 代码: preg_match_all("/(src)=[\"|'| ]{0,}([^>]*\. ...
- 将Android工程打成jar包之后对资源的调用。
Android工程不能完整的打包成jar包.这个主要是R文件导致的,但是我们可以将除了资源文件中的所有东西都打到jar包中.Activity.View等等类. 提供jar包的同时,还需要提供资源文件. ...
- centos6.5 网卡配置
家里用的电脑是电信拨号的 所以用不了桥接模式 改用nat vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" HW ...
- C#多线程Thread
在项目中经常用到线程Thread,先做个简单记录,后面再完善下,方便以后参考.本人技术有限,如有不同见解之处,欢迎博友批评指正. 执行的线程Thread分无参数的,一个参数,多个参数的.直接看代码吧. ...
- 笨办法学Python(二十二)
习题 22: 到现在你学到了哪些东西? 这节以及下一节的习题中不会有任何代码,所以也不会有习题答案或者加分习题.其实这节习题可以说是一个巨型的加分习题.我将让你完成一个表格,让你回顾你到现在学到的所有 ...