查看opcode
php是先把源碼解析成opcode,然后再把opcode傳遞給zend_vm進(jìn)行執(zhí)行的。
// 一個(gè)opcode的結(jié)構(gòu)struct _zend_op { const void *handler; // opcode對(duì)應(yīng)的執(zhí)行函數(shù),每個(gè)opcode都有一個(gè)對(duì)應(yīng)的執(zhí)行函數(shù) znode_op op1; // 執(zhí)行參數(shù)的第一個(gè)元素 znode_op op2; // 執(zhí)行參數(shù)的第二個(gè)元素 znode_op result; // 執(zhí)行結(jié)果 uint32_t extended_value; // 額外擴(kuò)展的字段和值 uint32_t lineno; // 行數(shù) zend_uchar opcode; // 操作碼,具體操作碼列表見(jiàn) http://cn.php.net/manual/zh/internals2.opcodes.php zend_uchar op1_type; // 第一個(gè)元素的類型 zend_uchar op2_type; // 第二個(gè)元素的類型 zend_uchar result_type; // 結(jié)果的類型};
在php7中,我們能很方便用phpdbg來(lái)查看一個(gè)文件或者一個(gè)函數(shù)的opcode了。至于phpdbg的使用,現(xiàn)在網(wǎng)上介紹不多,不過(guò)好在有很詳細(xì)的help文檔。下面是一個(gè)最簡(jiǎn)單的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 -