• 深入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用的比较多

  • 相关阅读:
    LeetCode:387字符串中唯一出现一一次的字符
    LeetCode-79. 单词搜索
    LeetCode-75. 颜色分类
    LeetCode-121. 买卖股票的最佳时机
    LeetCode-58. 最后一个单词的长度
    LeetCode-1103. 分糖果 II
    LeetCode:283. 移动零
    LeetCode:38. 外观数列
    LeetCode:70. 爬楼梯
    获取美拍视频的链接--JS分析
  • 原文地址:https://www.cnblogs.com/chenpingzhao/p/4822771.html
Copyright © 2020-2023  润新知