PHP内核之opcode解读

我们通过示例来说吧

<?php

echo '1'.print(2)+3;
exit;

?>
得出的opcode如图:


行号、指令编号、脚本开始标记、结束标记、ZEND VM指令、返回值、ZEND VM指令对应的参数。

ZEND VM执行opcode

struct _zend_op {  
    opcode_handler_t handler; // 执行该opcode时调用的处理函数  
    znode result;  
    znode op1;  
    znode op2;  
    ulong extended_value;  
    uint lineno;  
    zend_uchar opcode;  // opcode代码  
};  
  
struct _zend_op_array {  
    /* Common elements */  
    zend_uchar type;  
    char *function_name;          
    zend_class_entry *scope;  
    zend_uint fn_flags;  
    union _zend_function *prototype;  
    zend_uint num_args;  
    zend_uint required_num_args;  
    zend_arg_info *arg_info;  
    zend_bool pass_rest_by_reference;  
    unsigned char return_reference;  
    /* END of common elements */  
  
    zend_bool done_pass_two;  
  
    zend_uint *refcount;  
  
    zend_op *opcodes;  
    zend_uint last, size;  
  
    zend_compiled_variable *vars;  
    int last_var, size_var;  
  
    zend_uint T;  
  
    zend_brk_cont_element *brk_cont_array;  
    int last_brk_cont;  
    int current_brk_cont;  
  
    zend_try_catch_element *try_catch_array;  
    int last_try_catch;  
  
    /* static variables support */  
    HashTable *static_variables;  
  
    zend_op *start_op;  
    int backpatch_count;  
  
    zend_uint this_var;  
  
    char *filename;  
    zend_uint line_start;  
    zend_uint line_end;  
    char *doc_comment;  
    zend_uint doc_comment_len;  
    zend_uint early_binding; /* the linked list of delayed declarations */  
  
    void *reserved[ZEND_MAX_RESERVED_RESOURCES];  
};  
  
ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)  
{  
    // ... 循环执行op_array中的opcode或者执行其他op_array中的opcode  
}  

实际上我们编写的PHP,最终解析成ZEND VM中的指令集,最终通过ZEND VM返回结果。

每一条指令,都可以找到对用的函数执行,例如ECHO指令对应zend_do_echo。更多的可以查看Zend/compile.h

更多指令参见:http://php.net/manual/en/internals2.opcodes.list.php,同时列出了每条指令的案例


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值