深入PHP内核之全局变量
在阅读PHP源码的时候,会遇到很多诸如:CG(),EG() ,PG(),FG()这样的宏,如果不了解这些宏的意义,会给理解源码造成很大困难
EG()、这个宏可以用来访问符号表,函数,资源信息和常量
CG() 用来访问核心全局变量
PG() PHP全局变量。我们知道php.ini会映射一个或者多个PHP全局结构。举几个使用这个宏的例子:PG(register_globals), PG(safe_mode), PG(memory_limit)
FG() 文件全局变量。大多数文件I/O或相关的全局变量的数据流都塞进标准扩展出口结构。
申明 Zend/zend_globals_macros.h
- typedef struct _zend_compiler_globals zend_compiler_globals;
- typedef struct _zend_executor_globals zend_executor_globals;
- /* Compiler */
- #ifdef ZTS
- # define CG(v) TSRMG(compiler_globals_id, zend_compiler_globals *, v)
- int zendparse(void *compiler_globals);
- #else
- # define CG(v) (compiler_globals.v)
- extern ZEND_API struct _zend_compiler_globals compiler_globals;
- int zendparse(void);
- #endif
- /* Executor */
- #ifdef ZTS
- # define EG(v) TSRMG(executor_globals_id, zend_executor_globals *, v)
- #else
- # define EG(v) (executor_globals.v)
- extern ZEND_API zend_executor_globals executor_globals;
- #endif
结构体中的具体定义 Zend/zend_globals.h
- /* Define ZTS if you want a thread-safe Zend */
- /*#undef ZTS*/
- #ifdef ZTS
- BEGIN_EXTERN_C()
- ZEND_API extern int compiler_globals_id;
- ZEND_API extern int executor_globals_id;
- END_EXTERN_C()
- #endif
struct _zend_compiler_globals
- struct _zend_compiler_globals {
- zend_stack bp_stack;
- zend_stack switch_cond_stack;
- zend_stack foreach_copy_stack;
- zend_stack object_stack;
- zend_stack declare_stack;
- zend_class_entry *active_class_entry;
- /* variables for list() compilation */
- zend_llist list_llist;
- zend_llist dimension_llist;
- zend_stack list_stack;
- zend_stack function_call_stack;
- char *compiled_filename;
- int zend_lineno;
- zend_op_array *active_op_array;
- HashTable *function_table; /* function symbol table */
- HashTable *class_table; /* class table */
- HashTable filenames_table;
- HashTable *auto_globals;
- zend_bool parse_error;
- zend_bool in_compilation;
- zend_bool short_tags;
- zend_bool asp_tags;
- zend_declarables declarables;
- zend_bool unclean_shutdown;
- zend_bool ini_parser_unbuffered_errors;
- zend_llist open_files;
- long catch_begin;
- struct _zend_ini_parser_param *ini_parser_param;
- int interactive;
- zend_uint start_lineno;
- zend_bool increment_lineno;
- znode implementing_class;
- zend_uint access_type;
- char *doc_comment;
- zend_uint doc_comment_len;
- zend_uint compiler_options; /* set of ZEND_COMPILE_* constants */
- zval *current_namespace;
- HashTable *current_import;
- HashTable *current_import_function;
- HashTable *current_import_const;
- zend_bool in_namespace;
- zend_bool has_bracketed_namespaces;
- HashTable const_filenames;
- zend_compiler_context context;
- zend_stack context_stack;
- /* interned strings */
- char *interned_strings_start;
- char *interned_strings_end;
- char *interned_strings_top;
- char *interned_strings_snapshot_top;
- #ifndef ZTS
- char *interned_empty_string;
- #endif
- HashTable interned_strings;
- const zend_encoding **script_encoding_list;
- size_t script_encoding_list_size;
- zend_bool multibyte;
- zend_bool detect_unicode;
- zend_bool encoding_declared;
- #ifdef ZTS
- zval ***static_members_table;
- int last_static_member;
- #endif
- };
struct _zend_executor_globals
- struct _zend_executor_globals {
- zval **return_value_ptr_ptr;
- zval uninitialized_zval;
- zval *uninitialized_zval_ptr;
- zval error_zval;
- zval *error_zval_ptr;
- /* symbol table cache */
- HashTable *symtable_cache[SYMTABLE_CACHE_SIZE];
- HashTable **symtable_cache_limit;
- HashTable **symtable_cache_ptr;
- zend_op **opline_ptr;
- HashTable *active_symbol_table;
- HashTable symbol_table; /* main symbol table */
- HashTable included_files; /* files already included */
- JMP_BUF *bailout;
- int error_reporting;
- int orig_error_reporting;
- int exit_status;
- zend_op_array *active_op_array;
- HashTable *function_table; /* function symbol table */
- HashTable *class_table; /* class table */
- HashTable *zend_constants; /* constants table */
- zend_class_entry *scope;
- zend_class_entry *called_scope; /* Scope of the calling class */
- zval *This;
- long precision;
- int ticks_count;
- zend_bool in_execution;
- HashTable *in_autoload;
- zend_function *autoload_func;
- zend_bool full_tables_cleanup;
- /* for extended information support */
- zend_bool no_extensions;
- #ifdef ZEND_WIN32
- zend_bool timed_out;
- OSVERSIONINFOEX windows_version_info;
- #endif
- HashTable regular_list;
- HashTable persistent_list;
- zend_vm_stack argument_stack;
- int user_error_handler_error_reporting;
- zval *user_error_handler;
- zval *user_exception_handler;
- zend_stack user_error_handlers_error_reporting;
- zend_ptr_stack user_error_handlers;
- zend_ptr_stack user_exception_handlers;
- zend_error_handling_t error_handling;
- zend_class_entry *exception_class;
- /* timeout support */
- int timeout_seconds;
- int lambda_count;
- HashTable *ini_directives;
- HashTable *modified_ini_directives;
- zend_ini_entry *error_reporting_ini_entry;
- zend_objects_store objects_store;
- zval *exception, *prev_exception;
- zend_op *opline_before_exception;
- zend_op exception_op[3];
- struct _zend_execute_data *current_execute_data;
- struct _zend_module_entry *current_module;
- zend_property_info std_property_info;
- zend_bool active;
- zend_op *start_op;
- void *saved_fpu_cw_ptr;
- #if XPFPA_HAVE_CW
- XPFPA_CW_DATATYPE saved_fpu_cw;
- #endif
- void *reserved[ZEND_MAX_RESERVED_RESOURCES];
- };
一般EG用的比较多
深入PHP内核之全局变量的更多相关文章
- 24小时学通Linux内核之有关Linux文件系统实现的问题
有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问题,虽然Win10发布了,,但我还是好喜欢XP呀,好想回家用用家里的XP来 ...
- 十天学Linux内核之第五天---有关Linux文件系统实现的问题
原文:十天学Linux内核之第五天---有关Linux文件系统实现的问题 有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问 ...
- tms320dm6446内核启动分析
关于达芬奇DM6446,里面内部有两个部分,一个是ARM926ejs的核,还有一个是C64+DSP的视频处理核,而我需要关心的重点是arm926ejs的核(bootload和linux内核) 从boo ...
- Win7 x86内核调试与TP反调试的研究
参考 这两天对某P双机调试的学习及成果 ,非常好的一篇分析贴. 本文在Win7 x86下的分析,在虚拟机中以/DEBUG模式启动TP游戏,系统会自动重启. 0x01 内核调试全局变量 根据软件调试 ...
- v79.01 鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上) | 百篇博客分析OpenHarmony源码
百篇博客分析|本篇为:(用户态锁篇) | 如何使用快锁Futex(上) 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- 2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题 [转]
笔试(45 minute):(本来是四张纸,被我弄丢了一张!无伤大雅,难度级别不会有出入) 注意:由于时间紧迫和水平有限,难免有不足或错误,请指证,虚心学习! [PHP] 写出PHP中至少5个全局变量 ...
- cp命令的编写——浅谈系统调用
摘要:linux中cp命令的实现,通过这个程序,我们需要了解系统调用耗费时间的方面,同时学会系统调用的错误处理机制. 本文来源:http://blog.csdn.net/trochiluses/art ...
- 文件读写IO
摘要:本文主要总结了以下有关文件读写的IO,系统调用与库函数. 1.初级IO函数:close,creat,lseek,open,write 文件描述符是一个整型数 1.1close 1.2int cr ...
随机推荐
- java、js中实现无限层级的树形结构(类似递归)
js中: var zNodes=[ {id:0,pId:-1,name:"Aaaa"}, {id:1,pId:0,name:"A"}, {id:11,pId:1 ...
- 使用HTML5画柱状图
柱状图在很多应用中都比较常见,例如投票结果的统计分析,企业销售数据的统计分析等等. 需求分析: 一个柱状图一般包含以下几部分: 1.标题 2.横坐标(含标题) 3.竖坐标 (含标题.刻度 ...
- vijos p1729 Knights
描述 在一个N*N的正方形棋盘上,放置了一些骑士.我们将棋盘的行用1开始的N个自然数标记,将列用'A'开始的N个大写英文字母标记.举个例子来说,一个标准的8*8的国际象棋棋盘的行标记为1..8,列标记 ...
- 用wubi安装的Ubuntu在重装Windows 7系统后,如何恢复(转)
原文链接:双系统Win7+Ubuntu,重装Win7后找不到Ubuntu启动引导项问题 1.把安装ubuntu->winboot文件夹下wubidr和wubidr.mbr两个文件拷到C盘根目录下 ...
- strtok()函数
strtok()这个函数大家都应该碰到过,但好像总有些问题, 这里着重讲下它 首先看下MSDN上的解释: char *strtok( char *strToken, const char *strDe ...
- Informatica 常用组件Filter之二 过滤条件
过滤条件可以使用转换语言输入.过滤条件是返回 TRUE 或 FALSE 的表达式.例如,如果您要过滤出员工薪水低于 $30,000 的行,可输入以下条件: SALARY > 30000 可以使用 ...
- [leetcode]Populating Next Right Pointers in Each Node II @ Python
原题地址:https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ 题意: Follow up ...
- OkHttp 官方Wiki之【使用案例】
原文位置:https://github.com/square/okhttp/wiki/Recipes Recipes 食谱/知识点清单 We've written some recipes that ...
- 删除在Godaddy注册的域名,申请退款的全过程
1,删除域名. 登录进 Godaddy ,进入域名管理(Domain Manager),点击你要删除的域名,把要删除的域名前面打上对勾,再点击“delete selected”,确认,稍等一会就删除了 ...
- javascript简单性能问题及学习笔记
最近在看一本书:<高性能javaScript>,发现自己平时写js存在很多小细节上的问题,虽然这些问题不会导致程序运行出错,但是会导致界面加载变慢,用户体验变差,那么我们就来细细数一下应该 ...