查看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 -