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