在阅读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

  1. typedef struct _zend_compiler_globals zend_compiler_globals;
  2. typedef struct _zend_executor_globals zend_executor_globals;
  3.  
  4. /* Compiler */
  5. #ifdef ZTS
  6. # define CG(v) TSRMG(compiler_globals_id, zend_compiler_globals *, v)
  7. int zendparse(void *compiler_globals);
  8. #else
  9. # define CG(v) (compiler_globals.v)
  10. extern ZEND_API struct _zend_compiler_globals compiler_globals;
  11. int zendparse(void);
  12. #endif
  13.  
  14. /* Executor */
  15. #ifdef ZTS
  16. # define EG(v) TSRMG(executor_globals_id, zend_executor_globals *, v)
  17. #else
  18. # define EG(v) (executor_globals.v)
  19. extern ZEND_API zend_executor_globals executor_globals;
  20. #endif

 结构体中的具体定义 Zend/zend_globals.h

  1. /* Define ZTS if you want a thread-safe Zend */
  2. /*#undef ZTS*/
  3.  
  4. #ifdef ZTS
  5.  
  6. BEGIN_EXTERN_C()
  7. ZEND_API extern int compiler_globals_id;
  8. ZEND_API extern int executor_globals_id;
  9. END_EXTERN_C()
  10.  
  11. #endif

 struct _zend_compiler_globals

  1. struct _zend_compiler_globals {
  2. zend_stack bp_stack;
  3. zend_stack switch_cond_stack;
  4. zend_stack foreach_copy_stack;
  5. zend_stack object_stack;
  6. zend_stack declare_stack;
  7.  
  8. zend_class_entry *active_class_entry;
  9.  
  10. /* variables for list() compilation */
  11. zend_llist list_llist;
  12. zend_llist dimension_llist;
  13. zend_stack list_stack;
  14.  
  15. zend_stack function_call_stack;
  16.  
  17. char *compiled_filename;
  18.  
  19. int zend_lineno;
  20.  
  21. zend_op_array *active_op_array;
  22.  
  23. HashTable *function_table; /* function symbol table */
  24. HashTable *class_table; /* class table */
  25.  
  26. HashTable filenames_table;
  27.  
  28. HashTable *auto_globals;
  29.  
  30. zend_bool parse_error;
  31. zend_bool in_compilation;
  32. zend_bool short_tags;
  33. zend_bool asp_tags;
  34.  
  35. zend_declarables declarables;
  36.  
  37. zend_bool unclean_shutdown;
  38.  
  39. zend_bool ini_parser_unbuffered_errors;
  40.  
  41. zend_llist open_files;
  42.  
  43. long catch_begin;
  44.  
  45. struct _zend_ini_parser_param *ini_parser_param;
  46.  
  47. int interactive;
  48.  
  49. zend_uint start_lineno;
  50. zend_bool increment_lineno;
  51.  
  52. znode implementing_class;
  53.  
  54. zend_uint access_type;
  55.  
  56. char *doc_comment;
  57. zend_uint doc_comment_len;
  58.  
  59. zend_uint compiler_options; /* set of ZEND_COMPILE_* constants */
  60.  
  61. zval *current_namespace;
  62. HashTable *current_import;
  63. HashTable *current_import_function;
  64. HashTable *current_import_const;
  65. zend_bool in_namespace;
  66. zend_bool has_bracketed_namespaces;
  67.  
  68. HashTable const_filenames;
  69.  
  70. zend_compiler_context context;
  71. zend_stack context_stack;
  72.  
  73. /* interned strings */
  74. char *interned_strings_start;
  75. char *interned_strings_end;
  76. char *interned_strings_top;
  77. char *interned_strings_snapshot_top;
  78. #ifndef ZTS
  79. char *interned_empty_string;
  80. #endif
  81.  
  82. HashTable interned_strings;
  83.  
  84. const zend_encoding **script_encoding_list;
  85. size_t script_encoding_list_size;
  86. zend_bool multibyte;
  87. zend_bool detect_unicode;
  88. zend_bool encoding_declared;
  89.  
  90. #ifdef ZTS
  91. zval ***static_members_table;
  92. int last_static_member;
  93. #endif
  94. };

struct _zend_executor_globals

  1. struct _zend_executor_globals {
  2. zval **return_value_ptr_ptr;
  3.  
  4. zval uninitialized_zval;
  5. zval *uninitialized_zval_ptr;
  6.  
  7. zval error_zval;
  8. zval *error_zval_ptr;
  9.  
  10. /* symbol table cache */
  11. HashTable *symtable_cache[SYMTABLE_CACHE_SIZE];
  12. HashTable **symtable_cache_limit;
  13. HashTable **symtable_cache_ptr;
  14.  
  15. zend_op **opline_ptr;
  16.  
  17. HashTable *active_symbol_table;
  18. HashTable symbol_table; /* main symbol table */
  19.  
  20. HashTable included_files; /* files already included */
  21.  
  22. JMP_BUF *bailout;
  23.  
  24. int error_reporting;
  25. int orig_error_reporting;
  26. int exit_status;
  27.  
  28. zend_op_array *active_op_array;
  29.  
  30. HashTable *function_table; /* function symbol table */
  31. HashTable *class_table; /* class table */
  32. HashTable *zend_constants; /* constants table */
  33.  
  34. zend_class_entry *scope;
  35. zend_class_entry *called_scope; /* Scope of the calling class */
  36.  
  37. zval *This;
  38.  
  39. long precision;
  40.  
  41. int ticks_count;
  42.  
  43. zend_bool in_execution;
  44. HashTable *in_autoload;
  45. zend_function *autoload_func;
  46. zend_bool full_tables_cleanup;
  47.  
  48. /* for extended information support */
  49. zend_bool no_extensions;
  50.  
  51. #ifdef ZEND_WIN32
  52. zend_bool timed_out;
  53. OSVERSIONINFOEX windows_version_info;
  54. #endif
  55.  
  56. HashTable regular_list;
  57. HashTable persistent_list;
  58.  
  59. zend_vm_stack argument_stack;
  60.  
  61. int user_error_handler_error_reporting;
  62. zval *user_error_handler;
  63. zval *user_exception_handler;
  64. zend_stack user_error_handlers_error_reporting;
  65. zend_ptr_stack user_error_handlers;
  66. zend_ptr_stack user_exception_handlers;
  67.  
  68. zend_error_handling_t error_handling;
  69. zend_class_entry *exception_class;
  70.  
  71. /* timeout support */
  72. int timeout_seconds;
  73.  
  74. int lambda_count;
  75.  
  76. HashTable *ini_directives;
  77. HashTable *modified_ini_directives;
  78. zend_ini_entry *error_reporting_ini_entry;
  79.  
  80. zend_objects_store objects_store;
  81. zval *exception, *prev_exception;
  82. zend_op *opline_before_exception;
  83. zend_op exception_op[3];
  84.  
  85. struct _zend_execute_data *current_execute_data;
  86.  
  87. struct _zend_module_entry *current_module;
  88.  
  89. zend_property_info std_property_info;
  90.  
  91. zend_bool active;
  92.  
  93. zend_op *start_op;
  94.  
  95. void *saved_fpu_cw_ptr;
  96. #if XPFPA_HAVE_CW
  97. XPFPA_CW_DATATYPE saved_fpu_cw;
  98. #endif
  99.  
  100. void *reserved[ZEND_MAX_RESERVED_RESOURCES];
  101. };

一般EG用的比较多

深入PHP内核之全局变量的更多相关文章

  1. 24小时学通Linux内核之有关Linux文件系统实现的问题

    有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问题,虽然Win10发布了,,但我还是好喜欢XP呀,好想回家用用家里的XP来 ...

  2. 十天学Linux内核之第五天---有关Linux文件系统实现的问题

    原文:十天学Linux内核之第五天---有关Linux文件系统实现的问题 有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问 ...

  3. tms320dm6446内核启动分析

    关于达芬奇DM6446,里面内部有两个部分,一个是ARM926ejs的核,还有一个是C64+DSP的视频处理核,而我需要关心的重点是arm926ejs的核(bootload和linux内核) 从boo ...

  4. Win7 x86内核调试与TP反调试的研究

    参考  这两天对某P双机调试的学习及成果 ,非常好的一篇分析贴. 本文在Win7 x86下的分析,在虚拟机中以/DEBUG模式启动TP游戏,系统会自动重启. 0x01 内核调试全局变量  根据软件调试 ...

  5. v79.01 鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上) | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(用户态锁篇) | 如何使用快锁Futex(上) 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) ...

  6. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  7. 2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题 [转]

    笔试(45 minute):(本来是四张纸,被我弄丢了一张!无伤大雅,难度级别不会有出入) 注意:由于时间紧迫和水平有限,难免有不足或错误,请指证,虚心学习! [PHP] 写出PHP中至少5个全局变量 ...

  8. cp命令的编写——浅谈系统调用

    摘要:linux中cp命令的实现,通过这个程序,我们需要了解系统调用耗费时间的方面,同时学会系统调用的错误处理机制. 本文来源:http://blog.csdn.net/trochiluses/art ...

  9. 文件读写IO

    摘要:本文主要总结了以下有关文件读写的IO,系统调用与库函数. 1.初级IO函数:close,creat,lseek,open,write 文件描述符是一个整型数 1.1close 1.2int cr ...

随机推荐

  1. java、js中实现无限层级的树形结构(类似递归)

    js中: var zNodes=[ {id:0,pId:-1,name:"Aaaa"}, {id:1,pId:0,name:"A"}, {id:11,pId:1 ...

  2. 使用HTML5画柱状图

    柱状图在很多应用中都比较常见,例如投票结果的统计分析,企业销售数据的统计分析等等.    需求分析:  一个柱状图一般包含以下几部分:  1.标题  2.横坐标(含标题)  3.竖坐标 (含标题.刻度 ...

  3. vijos p1729 Knights

    描述 在一个N*N的正方形棋盘上,放置了一些骑士.我们将棋盘的行用1开始的N个自然数标记,将列用'A'开始的N个大写英文字母标记.举个例子来说,一个标准的8*8的国际象棋棋盘的行标记为1..8,列标记 ...

  4. 用wubi安装的Ubuntu在重装Windows 7系统后,如何恢复(转)

    原文链接:双系统Win7+Ubuntu,重装Win7后找不到Ubuntu启动引导项问题 1.把安装ubuntu->winboot文件夹下wubidr和wubidr.mbr两个文件拷到C盘根目录下 ...

  5. strtok()函数

    strtok()这个函数大家都应该碰到过,但好像总有些问题, 这里着重讲下它 首先看下MSDN上的解释: char *strtok( char *strToken, const char *strDe ...

  6. Informatica 常用组件Filter之二 过滤条件

    过滤条件可以使用转换语言输入.过滤条件是返回 TRUE 或 FALSE 的表达式.例如,如果您要过滤出员工薪水低于 $30,000 的行,可输入以下条件: SALARY > 30000 可以使用 ...

  7. [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 ...

  8. OkHttp 官方Wiki之【使用案例】

    原文位置:https://github.com/square/okhttp/wiki/Recipes Recipes 食谱/知识点清单 We've written some recipes that ...

  9. 删除在Godaddy注册的域名,申请退款的全过程

    1,删除域名. 登录进 Godaddy ,进入域名管理(Domain Manager),点击你要删除的域名,把要删除的域名前面打上对勾,再点击“delete selected”,确认,稍等一会就删除了 ...

  10. javascript简单性能问题及学习笔记

    最近在看一本书:<高性能javaScript>,发现自己平时写js存在很多小细节上的问题,虽然这些问题不会导致程序运行出错,但是会导致界面加载变慢,用户体验变差,那么我们就来细细数一下应该 ...