参考鸟哥的文章:http://www.laruence.com/2008/04/04/17.html
主要在php_request_startup函数中
问题:在代码什么位置放入PG(http_globals)的,流程是怎样的
1 PG(http_globals)[i] = NULL;//将除了TRACK_VARS_REQUEST以外的初始化为null
2 PG(register_globals)如果为真,则将PG(http_globals)[TRACK_VARS_POST]中的hash内容递归插入到EG(symbol_table)
3 sapi_module.treat_data
调用SAPI_TREAT_DATA_FUNC
为下面三个全局变量赋值
PG(http_globals)[TRACK_VARS_POST]
PG(http_globals)[TRACK_VARS_GET]= array_ptr;
PG(http_globals)[TRACK_VARS_COOKIE]= array_ptr;
4 php_auto_globals_create_env
PG(http_globals)[TRACK_VARS_ENV]= env_vars;
并放入到EG(symbol_table)
5 php_register_server_variables
PG(http_globals)[TRACK_VARS_SERVER]= array_ptr;
同上
php_build_argv(SG(request_info).query_string,PG(http_globals)[TRACK_VARS_SERVER] TSRMLS_CC); //补充PG(http_globals)[TRACK_VARS_SERVER]中hash值
6 php_auto_globals_create_request
Z_ARRVAL_P(form_variables) 目标
源如下
Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_GET])
Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_POST])
Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_COOKIE])
zend_hash_update(&EG(symbol_table),"_REQUEST", sizeof("_REQUEST"), &form_variables,sizeof(zval *), NULL);
理论上应该从EG(symbol_table)中也可以拿到这些值