· 作者:laruence(http://www.laruence.com/)· 本文地址:http://www.laruence.com/2008/11/07/581.html· 转载请注明出处 主要探讨了php的大变量的生成过程。另外如果你注意到, 当在表单中提交的input的name中如果有点号的时候, 在php中会自动把点号处理成下划线。并且你很想知道这是为什么,在什么时候发生的? 呵呵,本文也就这个问题做了回答。首先明确一个问题,php的变量名中是不能包含点号的。 但是为了处理表单中的点号命名,php就会自动把点号(.)转换成下划线(_)。 要知道php是怎么处理的,首先我们要了解,$_get, $_post, $_cookie等变量的构造过程。在每个请求到来以后,apache处理到response阶段的时候, 会将控制权交给php模块, php模块会在处理请求之前首先间接调用php_request_startup (具体调用序列是send_php -> apache_php_module_main ->php_request_startup, 关于这部门可以参看我前面的文章(php life cycle) , 在php_request_startup中:intphp_request_startup(tsrmls_d){intretval=success;
#if php_sigchildsignal(sigchld,sigchld_handler);#endifif(php_start_sapi()==failure){returnfailure; }php_output_activate(tsrmls_c); sapi_activate(tsrmls_c); php_hash_environment(tsrmls_c);
zend_try{pg(during_request_startup)=1; php_output_activate(tsrmls_c); if(pg(expose_php)){sapi_add_header(sapi_php_version_header,sizeof(sapi_php_version_header)-1,1); }}zend_catch{retval=failure; }zend_end_try();
returnretval;}
注意其中的php_hash_environment(tsrmls_c)函数调用 , 这个函数就是在请求处理前, 初始化请求相关的变量的函数。 这个函数定义在: main/php_variables.c中 , 有兴趣的可以看看:intphp_hash_environment(tsrmls_d){char*p; unsignedchar_gpc_flags[5]={0,0,0,0,0}; zend_booljit_initialization=(pg(auto_globals_jit)&& !pg(register_globals)&& !pg(register_long_arrays)); structauto_global_record{char*name; uintname_len; char*long_name; uintlong_name_len; zend_booljit_initialization; }auto_global_records[]={{“_post”,sizeof(“_post”),”http_post_vars”,sizeof(“http_post_vars”),0}, {“_get”,sizeof(“_get”),”http_get_vars”,sizeof(“http_get_vars”),0}, {“_cookie”,sizeof(“_cookie”),”http_cookie_vars”,sizeof(“http_cookie_vars”),0}, {“_server”,sizeof(“_server”),”http_server_vars”,sizeof(“http_server_vars”),1}, {“_env”,sizeof(“_env”),”http_env_vars”,sizeof(“http_env_vars”),1}, {“_files”,sizeof(“_files”),”http_post_files”,sizeof(“http_post_files”),0}, }; size_tnum_track_vars=sizeof(auto_global_records)/sizeof(structauto_global_record); size_ti;
/* jit_initialization = 0; */for(i=0;i