php擴展開發中$_SERVER返回報錯以及反思(一)

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呢 今晚上太晚了就思考到這裏明天繼續思考把

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章