您好,欢迎访问一九零五行业门户网

PHP内核中读取$

一、内核中获取$_get\$_post\$_server\$_files\$_cookie等全局变量 hashtable是php很多实现的基础,例如$_get\$_post等全局变量实现。 那么,在扩展中读取这些全局变量,当然还是操作hashtable。 内核中初始化环境变量的通过main/php_variables.c中php_hash_e
一、内核中获取$_get\$_post\$_server\$_files\$_cookie等全局变量
hashtable是php很多实现的基础,例如$_get\$_post等全局变量实现。
那么,在扩展中读取这些全局变量,当然还是操作hashtable。
内核中初始化环境变量的通过main/php_variables.c中php_hash_environment(tsrmls_d)
php在初始化环境变量的同时,考虑到对大变量的读性能,会通过main/php_variables.c的php_startup_auto_globals来注册一份只读的环境变量。
void php_startup_auto_globals(tsrmls_d){ zend_register_auto_global(_get, sizeof(_get)-1, null tsrmls_cc); zend_register_auto_global(_post, sizeof(_post)-1, null tsrmls_cc); zend_register_auto_global(_cookie, sizeof(_cookie)-1, null tsrmls_cc); zend_register_auto_global(_server, sizeof(_server)-1, php_auto_globals_create_server tsrmls_cc); zend_register_auto_global(_env, sizeof(_env)-1, php_auto_globals_create_env tsrmls_cc); zend_register_auto_global(_request, sizeof(_request)-1, php_auto_globals_create_request tsrmls_cc); zend_register_auto_global(_files, sizeof(_files)-1, null tsrmls_cc);}
只读环境变量的读取方式:&pg(http_globals)[track_vars_get];&pg(http_globals)[track_vars_post];&pg(http_globals)[track_vars_request];&pg(http_globals)[track_vars_cookie];&pg(http_globals)[track_vars_env];&pg(http_globals)[track_vars_files];
其中用到的宏为内核提供
/*main/php_globals.h*/#define track_vars_post 0#define track_vars_get 1#define track_vars_cookie 2#define track_vars_server 3#define track_vars_env 4#define track_vars_files 5#define track_vars_request 6
如果需要对环境变量进行修改,可以在全局作用域中搜索:(void)zend_hash_find(&eg(symbol_table), zend_strs(_get), (void **)&carrier);(void)zend_hash_find(&eg(symbol_table), zend_strs(_post), (void **)&carrier);(void)zend_hash_find(&eg(symbol_table), zend_strs(_request), (void **)&carrier);(void)zend_hash_find(&eg(symbol_table), zend_strs(_cookie), (void **)&carrier);(void)zend_hash_find(&eg(symbol_table), zend_strs(_files), (void **)&carrier);(void)zend_hash_find(&eg(symbol_table), zend_strs(_env), (void **)&carrier);
二、现在来看案例,定义一个类request,拥有方法getquery与getpost.来读取$_get和$_post
/* * fw_request.c * * created on: 2012-6-19 * author: jy */#ifdef have_config_h#include config.h#endif#include php.h#include php_ini.h#include main/sapi.h#include zend/zend_exceptions.h#include zend/zend_alloc.h#include php_fw.h#include fw_request.hzend_class_entry *request;/** *class request { public mixed getlang ( void ); public mixed getquery ( string $name = null );} *///定义类方法的参数类型,使内核自动校验参数类型zend_begin_arg_info(getqueryargs, 1) zend_arg_info(0, name)zend_end_arg_info()zend_begin_arg_info(getpostargs, 1) zend_arg_info(0, name)zend_end_arg_info()zend_method(request, getquery){ zval **carrier; zval *key, *ret; if(zend_parse_parameters(zend_num_args() tsrmls_cc, z, &key) == failure){ return_false; } ret = request_query(track_vars_get, z_strval_p(key), z_strlen_p(key) tsrmls_cc); return_zval(ret, 0, null);}zend_method(request, getpost){ zval **carrier; zval *key, *ret; if(zend_parse_parameters(zend_num_args() tsrmls_cc, z, &key) == failure){ return_false; } ret = request_query(track_vars_post, z_strval_p(key), z_strlen_p(key) tsrmls_cc); return_zval(ret, 0, null);}zend_function_entry functions_entry[] = { php_me(request, getquery, getqueryargs, zend_acc_public) php_me(request, getpost, getpostargs, zend_acc_public)};zend_minit_function(fw_request){ zend_class_entry ce; init_class_entry(ce, request, functions_entry); request = zend_register_internal_class_ex(&ce, null, null tsrmls_cc); return success;}/*定义request_query来完成内核中读取$_get\$_post\$_server\$_files\$_cookie\$_request其中只有$_request的值是可修改的*/zval * request_query(uint type, char * name, uint len tsrmls_dc) { zval **carrier, **ret; zend_bool jit_initialization = (pg(auto_globals_jit) && !pg(register_globals) && !pg(register_long_arrays)); switch (type) { case track_vars_post: case track_vars_get: case track_vars_files: case track_vars_cookie: carrier = &pg(http_globals)[type]; break; case track_vars_env: if (jit_initialization) { zend_is_auto_global(zend_strl(_env) tsrmls_cc); } carrier = &pg(http_globals)[type]; break; case track_vars_server: if (jit_initialization) { zend_is_auto_global(zend_strl(_server) tsrmls_cc); } carrier = &pg(http_globals)[type]; break; case track_vars_request: if (jit_initialization) { zend_is_auto_global(zend_strl(_request) tsrmls_cc); } (void)zend_hash_find(&eg(symbol_table), zend_strs(_request), (void **)&carrier); break; default: break; } if (!carrier || !(*carrier)) { zval *empty; make_std_zval(empty); zval_null(empty); return empty; } if (!len) { z_addref_p(*carrier); return *carrier; } if (zend_hash_find(z_arrval_pp(carrier), name, len + 1, (void **)&ret) == failure) { zval *empty; make_std_zval(empty); zval_null(empty); return empty; } z_addref_p(*ret); return *ret;}
三、网页访问php测试访问网址http://localhost/test.php?get=test,这个网址由你本地环境决定
$_get['test'] = abc;$obj = new request();echo $obj->getquery('test').
;echo $obj->getpost('test');
输出结果:
test

这也证明了,request_query读取的是只读全局变量。
其它类似信息

推荐信息