查看opcode

php是先把源碼解析成opcode,然后再把opcode傳遞給zend_vm進行執(zhí)行的。

// 一個opcode的結(jié)構(gòu)struct _zend_op {     const void *handler; // opcode對應(yīng)的執(zhí)行函數(shù),每個opcode都有一個對應(yīng)的執(zhí)行函數(shù)
     znode_op op1;  // 執(zhí)行參數(shù)的第一個元素
     znode_op op2;  //  執(zhí)行參數(shù)的第二個元素
     znode_op result; // 執(zhí)行結(jié)果
     uint32_t extended_value; // 額外擴展的字段和值
     uint32_t lineno; // 行數(shù)
     zend_uchar opcode;   // 操作碼,具體操作碼列表見 http://cn.php.net/manual/zh/internals2.opcodes.php
     zend_uchar op1_type; // 第一個元素的類型
     zend_uchar op2_type; // 第二個元素的類型
     zend_uchar result_type; // 結(jié)果的類型};

在php7中,我們能很方便用phpdbg來查看一個文件或者一個函數(shù)的opcode了。至于phpdbg的使用,現(xiàn)在網(wǎng)上介紹不多,不過好在有很詳細的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 -
        
		

網(wǎng)友評論