歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> PHP內核中重要的兩個全局變量

PHP內核中重要的兩個全局變量

日期:2017/3/1 9:37:39   编辑:Linux編程

在閱讀PHP源碼的時候,會遇到很多諸如:CG(),EG() 這樣的宏,如果不了解這些宏的意義,會給理解源碼造成很大困難。

Zend引擎中有兩個重要的全局變量結構體,就是Zend引擎關閉之前都會存在的變量:

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

CG 的含義就是 compiler_globals ,Zend編譯器相關的全局變量;

EG 的含義就是 executor_globals,Zend執行器相關的全局變量;

這兩個結構都包含了很多元素,對理解PHP內核有很重要的意義:

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;
int comment_start_line;
char *heredoc;
int heredoc_len;

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 in_compilation;
zend_bool short_tags;
zend_bool asp_tags;
zend_bool allow_call_time_pass_reference;

zend_declarables declarables;

/* For extensions support */
zend_bool extended_info; /* generate extension information for debugger/profiler */
zend_bool handle_op_arrays; /* run op_arrays through op_array handlers */

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;

#ifdef ZEND_MULTIBYTE
zend_encoding **script_encoding_list;
int script_encoding_list_size;
zend_bool detect_unicode;

zend_encoding *internal_encoding;

/* multibyte utility functions */
zend_encoding_detector encoding_detector;
zend_encoding_converter encoding_converter;
zend_encoding_oddlen encoding_oddlen;
#endif /* ZEND_MULTIBYTE */

#ifdef ZTS
HashTable **static_members;
int last_static_member;
#endif
};


struct _zend_executor_globals {
zval **return_value_ptr_ptr;

zval uninitialized_zval;
zval *uninitialized_zval_ptr;

zval error_zval;
zval *error_zval_ptr;

zend_function_state *function_state_ptr;
zend_ptr_stack arg_types_stack;

/* 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;

zval *This;

long precision;

int ticks_count;

zend_bool in_execution;
HashTable *in_autoload;
zend_function *autoload_func;
zend_bool full_tables_cleanup;
zend_bool ze1_compatibility_mode;

/* for extended information support */
zend_bool no_extensions;

#ifdef ZEND_WIN32
zend_bool timed_out;
#endif

HashTable regular_list;
HashTable persistent_list;

zend_ptr_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;

/* timeout support */
int timeout_seconds;

int lambda_count;

HashTable *ini_directives;
HashTable *modified_ini_directives;

zend_objects_store objects_store;
zval *exception;
zend_op *opline_before_exception;

struct _zend_execute_data *current_execute_data;

struct _zend_module_entry *current_module;

zend_property_info std_property_info;

zend_bool active;

void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};

CentOS 6.3 安裝LNMP (PHP 5.4,MyySQL5.6) http://www.linuxidc.com/Linux/2013-04/82069.htm

在部署LNMP的時候遇到Nginx啟動失敗的2個問題 http://www.linuxidc.com/Linux/2013-03/81120.htm

Ubuntu安裝Nginx php5-fpm MySQL(LNMP環境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

《細說PHP》高清掃描PDF+光盤源碼+全套教學視頻 http://www.linuxidc.com/Linux/2014-03/97536.htm

PHP 的詳細介紹:請點這裡
PHP 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved