PHP Module中获取$_GET/$_POST/$_COOKIE的方法研究
2013-07-05 11:56
597 查看
假设要获取$_GET['c']; 首先,先介绍下http_globals;
1.http_globals,定义在php_globals.h中; zval * http_globals[6]; 其中的索引为:
就是不知道为什么,http_globals定义为6个元素,但是索引却定义了7个,猜测可能是因为REQUREST本来也就是GET和POST的 merge,并且存取都是通过宏来进行,所以可能最后宏中会处理TRACK_VARS_REQUEST为GET和POST的merge。
2.获取方法:
3.分析 其中PG是一个宏,定义在php_globals.h中: # define PG(v) TSRMG(core_globals_id, php_core_globals *, v) 而TSRMG也是一个宏,定义在TSRM.h中: #define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) 而TSRM_UNSHUFFLE_RSRC_ID也是一个宏,也定义在TSRM.h中: #define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1)
那么PG(http_globals)展开后就会成为:
HASH_OF也是个宏,定义在zend_API.h中:
4.获取 根据测试的结果,可以认定PG(http_globals)[TRACK_VARS_GET]是一个hash table;
5.问题 有个问题就是,Zend中好像字符的len要计算结束符’\0′的,就是因为我定义len=1,导致crash N次。。郁闷。
6.再补充点关于return_value:
这样一来,我们的函数PHP_FUNCTION(getGetParam)就会变成: void zif_getGetParam( int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC);
可见,return_value是默认就定义的,是返回值的载体。
呵呵,就写这么多,有时间再补充。
7.原代码:
文章出处: http://www.laruence.com/2008/04/04/17.html
1.http_globals,定义在php_globals.h中; zval * http_globals[6]; 其中的索引为:
#defineTRACK_VARS_POST 0 #defineTRACK_VARS_GET 1 #defineTRACK_VARS_COOKIE 2 #defineTRACK_VARS_SERVER 3 #defineTRACK_VARS_ENV 4 #defineTRACK_VARS_FILES 5 #defineTRACK_VARS_REQUEST 6
就是不知道为什么,http_globals定义为6个元素,但是索引却定义了7个,猜测可能是因为REQUREST本来也就是GET和POST的 merge,并且存取都是通过宏来进行,所以可能最后宏中会处理TRACK_VARS_REQUEST为GET和POST的merge。
2.获取方法:
zval * arr; zval ** temp; char * key = "c", r_str; int len = 2, r_len,duplicate=1; arr = PG(http_globals)[TRACK_VARS_GET]; zend_hash_find(HASH_OF(arr), key, len, (void **)&temp); r_str = Z_STRVAL_PP(temp); r_len = Z_STRLEN_PP(temp); ZVAL_STRINGL(return_value, r_str, r_len, duplicate)
3.分析 其中PG是一个宏,定义在php_globals.h中: # define PG(v) TSRMG(core_globals_id, php_core_globals *, v) 而TSRMG也是一个宏,定义在TSRM.h中: #define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) 而TSRM_UNSHUFFLE_RSRC_ID也是一个宏,也定义在TSRM.h中: #define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1)
那么PG(http_globals)展开后就会成为:
PG(http_globals) =>; TSRM(core_globals_id, php_core_globals *, http_globals); =>; ((php_core_globals *)(*((void ***))tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(core_globals_id)])->http_globals); =>; ((php_core_globals *)(*((void ***))tsrm_ls))[(core_globals_id-1)])->http_globals);
HASH_OF也是个宏,定义在zend_API.h中:
#defineHASH_OF(p) (Z_TYPE_P(p)==IS_ARRAY ? Z_ARRVAL_P(p) : ((Z_TYPE_P(p)==IS_OBJECT ? Z_OBJ_HT_P(p)->get_properties((p) TSRMLS_CC) : NULL)))
4.获取 根据测试的结果,可以认定PG(http_globals)[TRACK_VARS_GET]是一个hash table;
5.问题 有个问题就是,Zend中好像字符的len要计算结束符’\0′的,就是因为我定义len=1,导致crash N次。。郁闷。
6.再补充点关于return_value:
php.h: #definePHP_FUNCTIONZEND_FUNCTION zend_API.h: #defineZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name)) zend_API.h: #defineZEND_FN(name) zif_##name zend_API.h: #defineZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS) zend.h: #defineINTERNAL_FUNCTION_PARAMETERS int ht, zval*return_value, zval**return_value_ptr, zval*this_ptr, int return_value_usedTSRMLS_DC</blockquote>
这样一来,我们的函数PHP_FUNCTION(getGetParam)就会变成: void zif_getGetParam( int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC);
可见,return_value是默认就定义的,是返回值的载体。
呵呵,就写这么多,有时间再补充。
7.原代码:
PHP_FUNCTION(confirm_getCookie_compiled){ char *arg = NULL; int arg_len, len; ulongikey; char * strg, * skey; zval * arr; zval**data; HashTable* h; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { WRONG_PARAM_COUNT; } arr = PG(http_globals)[TRACK_VARS_GET]; h = HASH_OF(arr); array_init(return_value); zend_hash_internal_pointer_reset(h); int count = zend_hash_num_elements(h); for(int i=0 ; i<count; i++){ zend_hash_get_current_data(h, (void**)&data); zend_hash_get_current_key(h, &skey, &ikey, 0); add_assoc_stringl(return_value, skey, Z_STRVAL_PP(data), Z_STRLEN_PP(data), 1); zend_hash_move_forward(h); } return; // RETURN_STRINGL(strg, len, 0); //ZVAL_STRINGL(return_value, strg, len, 0); }
文章出处: http://www.laruence.com/2008/04/04/17.html
相关文章推荐
- 在PHP Module中获取$_GET/$_POST/$_COOKIE的方法研究
- 在PHP Module中获取$_GET/$_POST/$_COOKIE的方法研究
- php发送get、post请求获取内容的几种方法
- php发送get、post请求的几种方法 以及获取内容
- php 获取提交的数据 $_REQUEST = $_GET + $_POST + $_COOKIE
- php使用fsockopen函数发送post,get请求获取网页内容的方法
- php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
- POST和GET的区别。PHP获取post数据的方法。
- php模拟GET与POST向微信接口提交及获取数据的方法
- php发送get、post请求获取内容的几种方法
- php使用fsockopen函数发送post,get请求获取网页内容的方法
- php页面session,cookie,post,get这四种传值方法
- PHP中使用CURL实现Get和Post请求的方法
- php中使用Curl、socket、file_get_contents三种方法POST提交数据
- ThinkPHP 3.获取get post参数与I方法
- PHP中使用cURL实现Get和Post请求的方法
- php用ini_get获取php.ini里变量值的方法
- PHP的curl实现get,post 和 cookie(几个实例)
- 在PHP中使用CURL实现GET和POST请求的方法
- php中运用http调用的GET和POST方法示例