如何编译php文件-php教程

资源魔 36 0
PHP是解析型初级言语,现实上从Zend内核的角度来看PHP就是一个一般的C顺序,它有main函数,咱们写的PHP代码是这个顺序的输出,而后通过内核的解决输入后果,内核将PHP代码"翻译"为C顺序可辨认的进程就是PHP的编译。

保举课程:PHP教程。

C顺序正在编译时将一行行代码编译为机械码,每个操作都以为是一条机械指令,这些指令写入到编译后的二进制顺序中,执行的时分将二进制顺序load进相应的内存区域(常量区、数据区、代码区)、调配运转栈,而后从代码区肇始地位开端执行,这是C顺序编译、执行的简略进程。

一样,PHP的编译与一般的C顺序相似,只是PHP代码不编译成机械码,而是解析成为了若干条opcode数组,每一条opcode就是C外面一般的struct,含意对应C顺序的机械指令,执行的进程就是引擎顺次执行opcode,比方咱们正在PHP里界说一个变量:$a = 123;,终极到内核里执行就是malloc一块内存,而后把值写出来。

正在zend_compile.h文件中,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; //前往值类型
};


以是PHP的解析进程义务就是将PHP代码(经过词法剖析re2c,语法剖析bison)转化为opcode数组,代码里的一切信息都保留正在opcode中,而后将opcode数组交给zend引擎执行,opcode就是内核详细执行的饬令,比方赋值、加减操作、函数挪用等,每一一条opcode都对应一个解决handle,这些handler是提前界说好的C函数。


struct _zend_op_array {
    //co妹妹on是一般函数或类成员办法对应的opcodes疾速拜访时应用的字段
    /* Co妹妹on elements */
    zend_uchar type;
    zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
    uint32_t fn_flags;
    zend_string *function_name;
    zend_class_entry *scope;
    zend_function *prototype;
    uint32_t num_args;
    uint32_t required_num_args;
    zend_arg_info *arg_info;
    /* END of co妹妹on elements */

    uint32_t *refcount;

    uint32_t last;
     //opcode指令数组
    zend_op *opcodes;

    //PHP代码里界说的变量数:op_type为IS_CV的变量,没有含IS_TMP_VAR、IS_VAR的
    //编译前此值为0,而后发现一个新变量这个值就加1
    int last_var;
    //暂时变量数:op_type为IS_TMP_VAR、IS_VAR的变量
    uint32_t T;
    //PHP变量名数组
    zend_string **vars;//这个数组正在ast编译时期合营last_var用来确定各个变量的编号,十分首要的一步操作

    int last_live_range;
    int last_try_catch;
    zend_live_range *live_range;
    zend_try_catch_element *try_catch_array;

    //动态变量符号表:经过static申明的
    /* static variables support */
    HashTable *static_variables;

    zend_string *filename;
    uint32_t line_start;
    uint32_t line_end;
    zend_string *doc_co妹妹ent;
    uint32_t early_binding; /* the linked list of delayed declarations */

    //字面量数目
    int last_literal;
    //字面量(常量)数组,这些都是正在PHP代码界说的一些值
    zval *literals;

    //运转时缓存数组巨细
    int  cache_size;
    //运转时缓存,次要用于缓存一些znode_op以便于疾速猎取数据,前面独自引见这个机制
    void **run_time_cache;

    void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};

opcode指令:即PHP代码详细对应的解决举措,与二进制顺序中的代码段对应
字面量存储:PHP代码中界说的一些变量初始值、挪用的函数称号、类称号、常量称号等等称之为字面量,这些值用于执行时初始化变量、函数挪用等等
变量调配状况:与字面量相似,这里指的是以后opcodes界说了几何变量、暂时变量,每一个变量都有一个对应的编号,执行初始化依照总的数量一次性调配zval,应用时也齐全依照编号索引,而没有是依据变量名索引

从PHP代码到opcode是怎样完成的?

最容易想到的形式就是正则婚配,当然进程不这么简略。PHP编译进程包罗词法剖析、语法剖析,应用re2c、bison实现,旧的PHP版本间接天生了opcode,PHP7新增了形象语法树(AST),正在语法剖析阶段天生AST,而后再天生opcode数组

以上就是若何编译php文件的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!