php擴展開發中$_SERVER返回報錯以及反思(一)
c 擴展中$_SERVER 存在到PG的http_globals中,但是我這麼寫卻返回出錯
zval* result = &PG(http_globals)[TRACK_VARS_SERVER];
RETURN_ZVAL(result,1,0);
我從網上找有 從yaf的源代碼中給出了這個解決方案
if (PG(auto_globals_jit)) {
zend_string *server_str = zend_string_init(ZEND_STRL("_SERVER"), 0);
zend_is_auto_global(server_str);
zend_string_release(server_str);
}
zval* result = &PG(http_globals)[TRACK_VARS_SERVER];
RETURN_ZVAL(result,1,0);
問題解決了,但是我開始了思考爲什麼問題解決了呢,追蹤源代碼:
重點查看 zend_is_auto_global(server_str);這一個
zend_bool zend_is_auto_global(zend_string *name) /* {{{ */
{
zend_auto_global *auto_global;
if ((auto_global = zend_hash_find_ptr(CG(auto_globals), name)) != NULL) {
if (auto_global->armed) {
auto_global->armed = auto_global->auto_global_callback(auto_global->name);
}
return 1;
}
return 0;
}
CG這個不用說 一個是存放編譯的全局變量
EG是存放一個執行的全局變量
typedef struct _zend_compiler_globals zend_compiler_globals;
typedef struct _zend_executor_globals zend_executor_globals;
好再次思考
if (auto_global->armed) {
auto_global->armed = auto_global->auto_global_callback(auto_global->name);
}
這個auto_global_callback是什麼呢 我找到了初始化的位置
int zend_register_auto_global(zend_string *name, zend_bool jit, zend_auto_global_callback auto_global_callback) /* {{{ */
{
zend_auto_global auto_global;
int retval;
auto_global.name = zend_new_interned_string(name);
auto_global.auto_global_callback = auto_global_callback;
auto_global.jit = jit;
retval = zend_hash_add_mem(CG(auto_globals), auto_global.name, &auto_global, sizeof(zend_auto_global)) != NULL ? SUCCESS : FAILURE;
zend_string_release(name);
return retval;
}
這個函數實現了他的初始化
zend_register_auto_global(zend_string_init(“_SERVER”, sizeof(“_SERVER”)-1, 1), PG(auto_globals_jit), php_auto_globals_create_server);
也就是說把他賦值了php_auto_globals_create_server
php_auto_globals_create_server這個函數是初始化$_SERVER的
但是爲什麼會返回NULL呢 今晚上太晚了就思考到這裏明天繼續思考把