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呢 今晚上太晚了就思考到这里明天继续思考把

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值