查看PHP opcode擴充模組Web服務

來源:互聯網
上載者:User

  最近花了大約一星期的時間寫了一個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

  結果如下:

  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:

  同時,也可以將結果下載到本地(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貢獻代碼。

  原文連結:http://www.codinglabs.org/html/opdumper-and-web-opcode-dumper.html



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.