YAF分析(一)
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
如果想在PHP擴展里使用擴展的全局變量,那么最好不要直接定義全局變量。因為PHP 是為多線程設(shè)計的,如果直接使用全局變量的話,很可能會讀到臟數(shù)據(jù)。PHP提供了一個創(chuàng)建全局變量的機制,可以同時應(yīng)用在多線程和非多線程環(huán)境中。我們應(yīng)當始終利用這個機制,而不要自主地定義全局變量。用一個宏訪問這些全局變量,使用起來就像普通全局變量一樣。在php_yaf.h文件的38到42行就定義了這樣一個宏;
#ifdef ZTS #define YAF_G(v) TSRMG(yaf_globals_id, zend_yaf_globals *, v) #else #define YAF_G(v) (yaf_globals.v) #endif 而php_yaf.h的83到128行就定義了yaf使用到的全局變量:
ZEND_BEGIN_MODULE_GLOBALS(yaf) /* 這里定義全局變量 */ ZEND_END_MODULE_GLOBALS(yaf) 同時調(diào)用:?
ZEND_DECLARE_MODULE_GLOBALS(yaf); 使全局變量生效。
而全局變量在每一次創(chuàng)建新的PHP線程時初始化這些全局變量時,這時我們就需要是用 ?PHP_GINIT_FUNCTION 宏來定義和注冊這樣一個構(gòu)造函數(shù)了。
PHP_GINIT_FUNCTION 實際上對應(yīng)到?ZEND_GINIT_FUNCTION,而?ZEND_GINIT_FUNCTION ?實際上是?ZEND_MODULE_GLOBALS_CTOR_D;
PHP_GINIT_FUNCTION(yaf) {/** 初始化全局變量 */ } 實際會生成以下C代碼:
void zm_globals_ctor_yaf (zend_yaf_globals *yaf_globals TSRMLS_DC) {/** 初始化全局變量 */ } 在線程退出時,需要將之前自己申請的資源釋放時,可以使用 PHP_GSHUTDOWN_FUNCTION來注冊析構(gòu)函數(shù)。
PHP_GSHUTDOWN_FUNCTION(yaf) {/** 清除全局變量 */ } 實際生成以下C代碼:
void zm_globals_dtor_yaf (zend_yaf_globals *yaf_globals TSRMLS_DC) {/** 清除全局變量 */ }
轉(zhuǎn)載于:https://my.oschina.net/jackin/blog/160664
總結(jié)
- 上一篇: Nginx自动安装脚本
- 下一篇: [C++] const与重载