· 作者:laruence(http://www.laruence.com/)· 本文地址:http://www.laruence.com/2008/11/07/581.html· 转载请注明出处主要探讨了php的大变量的生成过程。另外如......
· 作者: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中: int php_request_startup(TSRMLS_D) { int retval=SUCCESS;
#if PHP_SIGCHILD signal(SIGCHLD,sigchld_handler); #endif if (php_start_sapi()==FAILURE) { return FAILURE; } 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();
return retval; }
注意其中的php_hash_environment(TSRMLS_C)函数调用 , 这个函数就是在请求处理前, 初始化请求相关的变量的函数。 这个函数定义在: main/php_variables.c中 , 有兴趣的可以看看: int php_hash_environment(TSRMLS_D) { char*p; unsigned char _gpc_flags[5]={0,0,0,0,0}; zend_bool jit_initialization=(PG(auto_globals_jit)&& !PG(register_globals)&& !PG(register_long_arrays)); struct auto_global_record { char*name; uint name_len; char*long_name; uint long_name_len; zend_bool jit_initialization; } auto_global_records[]={ { "_POST",sizeof("_POST"),"HTTP_POST_VARS",sizeof("HTTP_POST_VARS"),0
1/4 1 2 3 4 下一页 尾页 |