發布一個查看PHP opcode的擴展模塊及Web服務


最近花了大約一星期的時間寫了一個PHP擴展模塊Opdumer,並封裝成了Web服務(點擊這里訪問)。這個模塊的主要內容是輸出PHP代碼對應的opcode。其實之前已經有一些用於查看opcode的擴展模塊,如比較有名的vld。之所以重新實現一個這樣的模塊,主要是因為vld不支持PHP_FUNCTION API,也就是說vld只能用於CLI形式,而Opdumer同時擁有CLI API和PHP_FUNCTION API,另外,也想借助編寫這個模塊的機會學習Zend Engine中opcode的編譯和執行機制。個人打算后面專門針對opcode的編譯執行機制寫一篇文章,而本文主要描述Opcode的使用方法及對應Web服務的使用。

Opdumper

安裝

Opdumper的源碼已經托管在github上,其地址為:https://github.com/ericzhang-cn/opdumper。可以通過以下命令克隆源代碼:

git clone https://github.com/ericzhang-cn/opdumper.git

Opdumper是一個標准的PHP Extension,安裝方法如下: 首先將Opdumper源碼放到PHP源碼包的ext/opdumper目錄下,進入此目錄執行如下命令:

phpize
./configure
make
make install

然后在php.ini中添加一行配置:

extension=opdumper.so

目前opdumper支持PHP>=5.3,在Linux和MacOS下測試通過,Windows下未做測試。

CLI API

Opdumper支持類似vld的命令行方式輸出opcode,只需在執行php命令時通過-d參數將opdumper.active=1傳入。例如我們有一個foo.php:

<?php
$a = 'hello';
echo $a;
?>

執行如下命令:

php -d opdumper.active=1 foo.php

結果如下: Snip20120516 4

PHP_FUNCTION API

Opdumper還支持vld不支持的PHP_FUNCTION API,Opdumper提供了兩個PHP函數:od_dump_opcodes_string和od_dump_opcodes_file。前者接受一個字符串作為產生,字符串是一段PHP代碼;后者接受一個PHP文件作為參數,返回值均是一個存有opcode結果的PHP數組。以od_dump_opcodes_file為例,我們在foo.php同一目錄下再寫一個bar.php:

<?php
$opcodes = od_dump_opcodes_file('./foo.php');
var_dump($opcodes);
?>

執行結果如下:

array(3) {
  [0]=>
  array(8) {
    ["lineno"]=>
    int(2)
    ["opcode"]=>
    string(11) "ZEND_ASSIGN"
    ["op1_type"]=>
    string(2) "CV"
    ["op2_type"]=>
    string(5) "CONST"
    ["result_type"]=>
    string(0) ""
    ["op1"]=>
    string(2) "~0"
    ["op2"]=>
    string(5) "hello"
    ["result"]=>
    string(0) ""
  }
  [1]=>
  array(8) {
    ["lineno"]=>
    int(3)
    ["opcode"]=>
    string(9) "ZEND_ECHO"
    ["op1_type"]=>
    string(2) "CV"
    ["op2_type"]=>
    string(6) "UNUSED"
    ["result_type"]=>
    string(6) "UNUSED"
    ["op1"]=>
    string(2) "~0"
    ["op2"]=>
    string(6) "UNUSED"
    ["result"]=>
    string(6) "UNUSED"
  }
  [2]=>
  array(8) {
    ["lineno"]=>
    int(5)
    ["opcode"]=>
    string(11) "ZEND_RETURN"
    ["op1_type"]=>
    string(5) "CONST"
    ["op2_type"]=>
    string(6) "UNUSED"
    ["result_type"]=>
    string(6) "UNUSED"
    ["op1"]=>
    string(1) "1"
    ["op2"]=>
    string(6) "UNUSED"
    ["result"]=>
    string(6) "UNUSED"
  }
}

Opdumper的Web服務:Opcode Dumper

坦白說,安裝PHP模塊還是挺麻煩的。所以為了方便朋友們查看opcode,我為Opdumper搭建了一個在線Web服務:http://supercompiler.com/app/opcode_dumper

Web頁面訪問

只要訪問這個頁面,在編輯框中輸入或粘貼進PHP代碼,就可以快速看到相應的opcode: Snip20120516 5同時,也可以將結果下載到本地(CSV文件格式)。

HTTP API方式訪問

您可以通過訪問如下API獲取PHP代碼的opcode: URI: http://supercompiler.com/api/dump_opcodes Method: POST Params: php_script=[您的PHP代碼]返回值為JSON格式,成功時success字段為"true",data字段存儲opcodes;失敗時success字段為"false",msg字段存放失敗原因。 由於跨越的關系,目前只能使用Curl而不能使用Ajax方式調用這個API,后續會為其增加JSONP接口。

結語

目前這個模塊還比較初級,有很多需要完善的地方。也歡迎有興趣的朋友通過github貢獻代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM