ホームページ >バックエンド開発 >PHPチュートリアル >PHP の GET/POST およびその他の大きな変数の生成プロセス_PHP チュートリアル

PHP の GET/POST およびその他の大きな変数の生成プロセス_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:35:171165ブラウズ

· 作者: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
},
               {
"_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_t
num_track_vars=sizeof(auto_global_records)/sizeof(struct
auto_global_record);
        size_t
i;

/* jit_initialization = 0; */
for
(i=0;i{
PG(http_globals)[i]=NULL;
}
for
(p=PG(variables_order);p&& *p;p++)
{
switch(*p)
{
case
p:
case
P:
if
(!_gpc_flags[0]&& !SG(headers_s) ent)&&SG(request_info).request_method&& !strcasecmp(SG(request_info).request_method," POST"))
{
sapi_module.treat_data(PARSE_POST,NULL,NULL
TSRMLS_CC);      /* POST データ */
_gpc_flags[0]=1;
if
(PG(register_globals))
{
php_autoglobal_merge(&EG(symbol_table),Z_ARRVAL_P(PG(http_globals) )[TRACK_VARS_POST])
TSRMLS_CC);
}
}
break;
....以下省略、www.devdao.com:
}}}


ここで追加の説明を完了しました。つまり、php.ini では、variables_order を使用して、PHP がすでに大きな量の生成順序を生成するかどうかを制御できます。情况下、如果先処理p、後処理g、那么$_GET[a]、就会被盖$_POST[a];
見ることができます、离成功不远了、sapi_module.treat_data 即ちphp_default_treat_data,
php_default_treat_data内で、变量,都调用php_register_variable_safe来注册变量, 而php_register_variable_safe最终会调用php_register_variable_ex:
PHPAPI
void
php_register_variable_ex(char*var,zval*val,zval*track_vars_array
TSRMLS_DC)
{
char*p=NULL;
char*ip ;      /* インデックス ポインター */
char*index, *escaped_index=NULL;
int
var_len,index_len;
zval*gpc_element, **gpc_element_p;
zend_bool
is_array=0;
HashTable*symtable1=NULL;

assert(var!=NULL);

if

(track_vars_array)
{
symtable1=Z_ARRVAL_P(track_vars_array);
}
else
if
(PG(register_globals))
{
symtable1=EG(active_symbol_table);
}
if
(!symtable1)
{
/* 何もすることはありません */
zval_dtor(val);
return;
}
/*
* 変数名を準備します
*/
/* 変数名の先頭のスペースを無視します */
while
(*var&& *var ==
)
{
var++;
}
/* 変数名にスペースやドットが含まれていないことを確認してください (バイナリセーフではありません) */
// 以下は特に注意してください。。。 =var; *p;p++)
{
if
(*p==
|| *p==.)
{
*p=_;
}
else
if
(*p==[)
{
is_array=1;
&


http://www.bkjia.com/PHPjc/508336.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/508336.html技術記事 · 作者:laruence(http://www.laruence.com/) · 本文地址:http://www.laruence.com/2008/11/07/581.html · 转下请注明出处主探索讨了PHP的大量の生成過程。また...

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。