查看opcode

php是先把源码解析成opcode,然后再把opcode传递给zend_vm进行执行的。

// 一个opcode的结构struct _zend_op {     const void *handler; // opcode对应的执行函数,每个opcode都有一个对应的执行函数
     znode_op op1;  // 执行参数的第一个元素
     znode_op op2;  //  执行参数的第二个元素
     znode_op result; // 执行结果
     uint32_t extended_value; // 额外扩展的字段和值
     uint32_t lineno; // 行数
     zend_uchar opcode;   // 操作码,具体操作码列表见 http://cn.php.net/manual/zh/internals2.opcodes.php
     zend_uchar op1_type; // 第一个元素的类型
     zend_uchar op2_type; // 第二个元素的类型
     zend_uchar result_type; // 结果的类型};

在php7中,我们能很方便用phpdbg来查看一个文件或者一个函数的opcode了。至于phpdbg的使用,现在网上介绍不多,不过好在有很详细的help文档。下面是一个最简单的opcode代码:

$ bin/phpdbg -f /home/xiaoju/software/php7/demo/echo.php
prompt> list 10000001: <?php00002:00003: $a = 1;00004: $b = $a;00005: $b = $b + 1;00006: echo $b;00007:
prompt> print exec
[Context /home/xiaoju/software/php7/demo/echo.php (6 ops)]
L1-7 {main}() /home/xiaoju/software/php7/demo/echo.php -
        
		

网友评论