日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP內核探索 —— 預定義變量:PHP腳本運行前將一些特殊變量加到符號表

瀏覽:148日期:2022-09-16 14:43:53

大家都知道PHP腳本在執行的時候用戶全局變量(在用戶空間顯式定義的變量)會保存在一個HashTable數據類型的符號表(symbol_table)中, 在PHP中有一些比較特殊的全局變量例如: $_GET,$_POST,$_SERVER等變量,我們并沒有在程序中定義這些變量,并且這些變量也同樣保存在符號表中, 從這些表象我們不難得出結論:PHP是在腳本運行之前就將這些特殊的變量加入到了符號表中了。

$GLOBALS的初始化

我們以cgi模式為例說明$GLOBALS的初始化。 從cgi_main.c文件main函數開始。 整個調用順序如下所示:

[main() -> php_request_startup() -> zend_activate() -> init_executor() ]

... // 省略zend_hash_init(&EG(symbol_table), 50, NULL, ZVAL_PTR_DTOR, 0);{ zval *globals; ALLOC_ZVAL(globals); Z_SET_REFCOUNT_P(globals, 1); Z_SET_ISREF_P(globals); Z_TYPE_P(globals) = IS_ARRAY; Z_ARRVAL_P(globals) = &EG(symbol_table); zend_hash_update(&EG(symbol_table), 'GLOBALS', sizeof('GLOBALS'),&globals, sizeof(zval *), NULL); // 添加全局變量GLOBALS}... // 省略

上面的代碼的關鍵點zend_hash_update函數的調用,它將變量名為GLOBALS的變量注冊到EG(symbol_table)中, EG(symbol_table)是一個HashTable的結構,用來存放所有的全局變量。 這在下面將要提到的$_GET等變量初始化時也會用到。

$_GET、$_POST等變量的初始化

$_GET、$_COOKIE、$_SERVER、$_ENV、$_FILES、$_REQUEST這六個變量都是通過如下的調用序列進行初始化。 [main() -> php_request_startup() -> php_hash_environment() ]

在請求初始化時,通過調用 php_hash_environment 函數初始化以上的六個預定義的變量。 如下所示為php_hash_environment函數的代碼。在代碼之后我們以$_POST為例說明整個初始化的過程。

/* {{{ php_hash_environment */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< num_track_vars; 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_sent) && SG(request_info).request_method && !strcasecmp(SG(request_info).request_method, 'POST')) {sapi_module.treat_data(PARSE_POST, NULL, NULL TSRMLS_CC); /* POST Data */_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;case ’c’:case ’C’:if (!_gpc_flags[1]) {sapi_module.treat_data(PARSE_COOKIE, NULL, NULL TSRMLS_CC); /* Cookie Data */_gpc_flags[1] = 1;if (PG(register_globals)) {php_autoglobal_merge(&EG(symbol_table), Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_COOKIE]) TSRMLS_CC);}}break;case ’g’:case ’G’:if (!_gpc_flags[2]) {sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC); /* GET Data */_gpc_flags[2] = 1;if (PG(register_globals)) {php_autoglobal_merge(&EG(symbol_table), Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_GET]) TSRMLS_CC);}}break;case ’e’:case ’E’:if (!jit_initialization && !_gpc_flags[3]) {zend_auto_global_disable_jit('_ENV', sizeof('_ENV')-1 TSRMLS_CC);php_auto_globals_create_env('_ENV', sizeof('_ENV')-1 TSRMLS_CC);_gpc_flags[3] = 1;if (PG(register_globals)) {php_autoglobal_merge(&EG(symbol_table), Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_ENV]) TSRMLS_CC);}}break;case ’s’:case ’S’:if (!jit_initialization && !_gpc_flags[4]) {zend_auto_global_disable_jit('_SERVER', sizeof('_SERVER')-1 TSRMLS_CC);php_register_server_variables(TSRMLS_C);_gpc_flags[4] = 1;if (PG(register_globals)) {php_autoglobal_merge(&EG(symbol_table), Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]) TSRMLS_CC);}}break;}}/* argv/argc support */if (PG(register_argc_argv)) {php_build_argv(SG(request_info).query_string, PG(http_globals)[TRACK_VARS_SERVER] TSRMLS_CC);}for (i=0; i < num_track_vars; i++) {if (jit_initialization && auto_global_records[i].jit_initialization) {continue;}if (!PG(http_globals)[i]) {ALLOC_ZVAL(PG(http_globals)[i]);array_init(PG(http_globals)[i]);INIT_PZVAL(PG(http_globals)[i]);}Z_ADDREF_P(PG(http_globals)[i]);zend_hash_update(&EG(symbol_table), auto_global_records[i].name, auto_global_records[i].name_len, &PG(http_globals)[i], sizeof(zval *), NULL);if (PG(register_long_arrays)) {zend_hash_update(&EG(symbol_table), auto_global_records[i].long_name, auto_global_records[i].long_name_len, &PG(http_globals)[i], sizeof(zval *), NULL);Z_ADDREF_P(PG(http_globals)[i]);}}/* Create _REQUEST */if (!jit_initialization) {zend_auto_global_disable_jit('_REQUEST', sizeof('_REQUEST')-1 TSRMLS_CC);php_auto_globals_create_request('_REQUEST', sizeof('_REQUEST')-1 TSRMLS_CC);}return SUCCESS;}

以$_POST為例,首先以 auto_global_record 數組形式定義好將要初始化的變量的相關信息。 在變量初始化完成后,按照PG(variables_order)指定的順序(在php.ini中指定),通過調用sapi_module.treat_data處理數據。

從PHP實現的架構設計看,treat_data函數在SAPI目錄下不同的服務器應該有不同的實現,只是現在大部分都是使用的默認實現。

在treat_data后,如果打開了PG(register_globals),則會調用php_autoglobal_merge將相關變量的值寫到符號表。

以上的所有數據處理是一個賦值前的初始化行為。在此之后,通過遍歷之前定義的結構體, 調用zend_hash_update,將相關變量的值賦值給&EG(symbol_table)。 另外對于$_REQUEST有獨立的處理方法。

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久久伊人| 四虎4545www国产精品| 一区二区国产在线| 亚洲精品激情| 国产乱子精品一区二区在线观看| 国产精品xxx在线观看| 另类小说一区二区三区| 欧美精品成人| 日韩精品91| 午夜国产一区二区| 日欧美一区二区| 97国产成人高清在线观看| 影音先锋国产精品| 视频一区视频二区中文| 亚洲三级精品| 国产精品一二| 香蕉视频亚洲一级| 免播放器亚洲| 国产精品日本一区二区三区在线| 免费亚洲婷婷| 在线精品小视频| 国产精品久久久久久久久久妞妞| 欧美日韩水蜜桃| 欧美精品影院| 久久99久久久精品欧美| 亚洲成人av观看| 免费国产亚洲视频| 日本久久综合| 国产亚洲一级| 国产精品久久免费视频| 久久婷婷久久| 国产乱码精品一区二区三区亚洲人| 日韩欧美一区二区三区免费看| 日韩高清在线一区| 91精品99| 久久男人天堂| 国产精品xvideos88| 免费日本视频一区| 欧美日中文字幕| 精品国产乱码久久久久久樱花| 免费视频一区二区| 丝袜美腿诱惑一区二区三区 | 亚洲人www| 成人台湾亚洲精品一区二区| 久久xxxx| 激情综合亚洲| 91亚洲一区| 欧美久久香蕉| 蜜桃av一区二区在线观看| 精品免费在线| 精品女同一区二区三区在线观看| 免费久久精品视频| 欧美成人久久| 国产日韩1区| 亚洲成人二区| 麻豆国产精品视频| 石原莉奈在线亚洲二区| 精品欧美一区二区三区在线观看| 国产精品国码视频| 亚洲精选av| 欧美91在线| 综合色就爱涩涩涩综合婷婷| 日韩黄色大片| 久久久精品区| 五月亚洲婷婷 | 免费在线观看一区二区三区| 黑丝美女一区二区| 久草免费在线视频| 正在播放日韩精品| 麻豆国产精品777777在线| 国产经典一区| 麻豆精品一区二区综合av| 国产精品久久久久av蜜臀| 日本午夜精品一区二区三区电影| 中文字幕视频精品一区二区三区| 亚洲婷婷丁香| 亚洲精品成人一区| 日本不卡在线视频| 日韩精选在线| 亚洲精品乱码日韩| 日韩精品一区二区三区中文字幕| 亚洲狼人精品一区二区三区| 日韩中文字幕一区二区三区| 日韩中文字幕av电影| 蜜桃av一区二区| 日本亚洲最大的色成网站www| 少妇高潮一区二区三区99| 日韩福利视频导航| 国产精品视频3p| 精品国产精品久久一区免费式| 麻豆视频在线看| 午夜精品成人av| 欧美福利一区| 亚洲综合日韩| 日本亚州欧洲精品不卡| 日韩二区三区四区| 麻豆视频一区| 日韩欧美一区二区三区在线视频| 日韩精品影视| 99riav1国产精品视频| 亚洲最新av| 日韩精品视频网| 国产精品porn| 日韩精品不卡一区二区| 久久国产中文字幕| 丝袜国产日韩另类美女| 日本成人在线不卡视频| 欧美国产日韩电影| 在线亚洲人成| 午夜日韩福利| 中文字幕亚洲影视| 欧美aaaaaa午夜精品| 久久在线免费| 亚洲婷婷丁香| 老鸭窝一区二区久久精品| 日本少妇一区| 综合激情在线| 欧美黑人做爰爽爽爽| 日韩在线短视频| 性欧美xxxx免费岛国不卡电影| 日韩在线一区二区| 美女在线视频一区| 国产在线日韩| 欧美片网站免费| av资源亚洲| 久久国产高清| 国产精品porn| japanese国产精品| 久久精品99久久久| 久久香蕉国产| 青青草伊人久久| 黄色aa久久| 亚洲欧美日韩国产| 久久精品国产久精国产爱| 五月天综合网站| 国产精品黄网站| 国产精品日本欧美一区二区三区| 国产伦理一区| 午夜精品网站| 精品一区二区三区中文字幕视频 | 日韩av有码| 视频一区二区三区在线| 狠狠久久伊人中文字幕| 日韩欧美精品| 亚洲精品成人一区| 国产精品国码视频| 激情综合网址| 国产精品蜜月aⅴ在线| 波多野结衣一区| 麻豆国产精品| 亚洲精品看片| 欧美va天堂在线| 国产一区二区三区四区五区传媒| 模特精品在线| caoporn视频在线| 青青草国产精品亚洲专区无| 伊人久久大香线蕉av不卡| **爰片久久毛片| 欧美精品黄色| 日韩久久精品网| 国产精品日本一区二区不卡视频| 日韩在线一二三区| 九色porny丨国产首页在线| 国产精品超碰| 亚洲精品大片| 国产视频久久| 欧美片第1页| 精品国产午夜肉伦伦影院 | 午夜宅男久久久| 中文字幕高清在线播放| 欧美亚洲tv| 免费黄网站欧美| 国产精品97| 欧产日产国产精品视频| 久久av网址| 国产精品一区免费在线| 日韩和欧美一区二区三区| 美女日韩在线中文字幕| 999久久久精品国产| 国产一区二区三区天码| 国产福利一区二区三区在线播放| 中文字幕免费精品| 鲁大师成人一区二区三区 | 亚洲在线网站| 久久久五月天| 日韩欧美一区免费| 国产成人精品一区二区三区视频 | 视频一区二区欧美| 午夜国产精品视频| 亚洲精品va| 欧美日韩尤物久久| 日韩大片免费观看| 日韩电影二区| 亚洲精品成人图区| 成人影视亚洲图片在线| 久久久久伊人| 老司机精品在线| 久久久国产精品入口麻豆| 国产精品免费大片| 国产精品久久|