电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:86日期: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
相關文章:
主站蜘蛛池模板: 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 浙江宝泉阀门有限公司| 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 聚合氯化铝价格_聚合氯化铝厂家_pac絮凝剂-唐达净水官网 | 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 | 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | 生态板-实木生态板-生态板厂家-源木原作生态板品牌-深圳市方舟木业有限公司 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 致胜管家软件服务【在线免费体验】| 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 营养师网,营养师考试时间,报名入口—网站首页 | 皮带输送机-大倾角皮带输送机-皮带输送机厂家-河南坤威机械 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 北京租车牌|京牌指标租赁|小客车指标出租 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 河南彩印编织袋,郑州饲料编织袋定制,肥料编织袋加工厂-盛军塑业 河南凯邦机械制造有限公司 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 水热合成反应釜-防爆高压消解罐-西安常仪仪器设备有限公司 | 彩信群发_群发彩信软件_视频短信营销平台-达信通 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 开平机_纵剪机厂家_开平机生产厂家|诚信互赢-泰安瑞烨精工机械制造有限公司 | 无痕胶_可移胶_无痕双面胶带_可移无痕胶厂家-东莞凯峰 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 |