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

本文介绍了在PHP7扩展开发中如何处理全局变量,特别是涉及到线程安全的场景。通过ZEND_BEGIN_MODULE_GLOBALS和ZEND_END_MODULE_GLOBALS宏定义结构体,ZEND_DECLARE_MODULE_GLOBALS注册到TSRM,以及使用ZEND_MODULE_GLOBALS_ACCESSOR宏方便访问全局变量。示例展示了如何在扩展中读写这些全局资源。
摘要由CSDN通过智能技术生成

使用C语言开发程序时经常会使用全局变量进行数据存储,这就涉及前面已经介绍过的一个问题:线程安全,PHP设计了TSRM(即:线程安全资源管理器)用于解决这个问题,内核中频繁使用到的EG、CG等都是根据是否开启ZTS封装的宏,同样的,在扩展中也需要必须按照TSRM的规范定义全局变量,除非你的扩展不支持多线程的环境。

PHP为扩展的全局变量提供了一种存储方式:每个扩展将自己所有的全局变量统一定义在一个结构体中,然后将这个结构体注册到TSRM中,这样扩展就可以像使用EG、CG那样访问这个结构体。

这个结构体的定义通过 ZEND_BEGIN_MODULE_GLOBALS(extension_name) ,ZEND_END_MODULE_GLOBALS(extension_name) 两个宏完成,这两个宏必须成对出现,中间定义扩展需要的全局变量即可

ZEND_BEGIN_MODULE_GLOBALS(hello)
	zend_long  greeting; 
ZEND_END_MODULE_GLOBALS(hello)

展开后实际就是个普通的struct:

typedef struct _zend_hello_globals {
	zend_long greeting;
}zend_hello_globals;

接着创建一个此结构体的全局变量,这时候就会涉及ZTS了,如果未开启线程安全直接创建普通的全局变量即可,如果开启线程安全了则需要向TSRM注册,得到一个唯一的资源id,这个操作也由专门的宏来完成:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值