php的zend引擎执行过程 一

1. Zend引擎主要包含两个核心部分:编译、执行:

                           

    执行阶段主要用到的数据结构:

          opcode: php代码编译产生的zend虚拟机可识别的指令,php7有173个opcode,定义在 zend_vm_opcodes.hPHP中的所有语法实现都是由这些opcode组成的。

         

struct _zend_op {
    const void *handler; //对应执行的C语言function,即每条opcode都有一个C function处理
    znode_op op1;   //操作数1
    znode_op op2;   //操作数2
    znode_op result; //返回值
    uint32_t extended_value; 
    uint32_t lineno; 
    zend_uchar opcode;  //opcode指令
    zend_uchar op1_type; //操作数1类型
    zend_uchar op2_type; //操作数2类型
    zend_uchar result_type; //返回值类型
};

         zend_op_array : zend引擎执行阶段的输入数据结构,整个执行阶段都是操作这个数据结构。

             

                            

             zend_op_array有三个核心部分:opcode指令(对应c的指令)

                                                   字面量存储(变量初始值、调用的函数名称、类名称、常量名称等等称之为字面量)

                                                   变量分配的情况 (当前array定义的变量 临时变量的数量 编号,执行初始化一次性分配zval,使用时完全按照标号索引不是根据变量名)

         

           zend_executor_globals     PHP整个生命周期中最主要的一个结构,是一个全局变量,在main执行前分配(非ZTS下),直到PHP退出,它记录着当前请求全部的信息,经常见到的一个宏EG操作的就是这个结构。

                                定义在zend_globals.h中:

                                   

                

               zend_execute_data  是执行过程中最核心的一个结构,每次函数的调用、include/require、eval等都会生成一个新的结构,它表示当前的作用域、代码的执行位置以及局部变量的分配等等,等同于机器码执行过程中stack的角色,后面分析具体执行流程的时候会详细分析其作用。 

              zend_execute_data与zend_op_array的关联关系:

                                         

猜你喜欢

转载自www.cnblogs.com/hellohell/p/9101803.html
今日推荐