私は最近、約 1 週間かけて PHP 拡張モジュール Opdumer を作成し、それを Web サービスにカプセル化しました (ここをクリックしてアクセスしてください)。このモジュールの主な内容は、PHP コードに対応するオペコードを出力することです。実際、有名な vld など、オペコードを表示するための拡張モジュールがこれまでにもいくつかありました。このようなモジュールを再実装する主な理由は、vld が PHP_FUNCTION API をサポートしていないためです。つまり、vld は CLI 形式でのみ使用できますが、Opdumer には CLI API と PHP_FUNCTION API の両方が備わっているため、さらに学習したいからです。このモジュールを作成すると、Zend Engine でオペコードのコンパイルと実行のメカニズムが作成されます。個人的には、後でオペコードのコンパイルと実行のメカニズムに特化した記事を書く予定であり、この記事では主にオペコードの使用法とそれに対応する Web サービスの使用法について説明します。
オプダンパー
インストール
Opdumper のソース コードは github でホストされており、アドレスは https://github.com/ericzhang-cn/opdumper です。ソース コードは次のコマンドで複製できます:
git clone https://github.com/ericzhang-cn/opdumper.git
Opdumper は標準の PHP 拡張機能です。インストール方法は次のとおりです:
まず、Opdumper ソース コードを PHP ソース コード パッケージの ext/opdumper ディレクトリに配置し、次のコマンドを実行します。
phpize
./configure
作る
メイクインストール
次に、php.ini に構成の行を追加します:
拡張子=opdumper.so
現在、opdumper は PHP>=5.3 をサポートしており、Linux および MacOS ではテストされていますが、Windows ではテストされていません。CLI API
Opdumper は、オペコードを出力するための vld と同様のコマンド ライン メソッドをサポートしています。php コマンドを実行するときに、-d パラメーターを介して opdumper.active=1 を渡すだけです。たとえば、foo.php があります:
$a = 'こんにちは';
echo $a;
?>
次のコマンドを実行します:
php -d opdumper.active=1 foo.php
結果は次のとおりです:
PHP_FUNCTION API
Opdumper は、vld がサポートしていない 2 つの PHP 関数、od_dump_opcodes_string と od_dump_opcodes_file を提供する PHP_FUNCTION API もサポートしています。前者は生成された文字列 (PHP コードの一部) として文字列を受け取り、後者は PHP ファイルをパラメータとして受け取り、戻り値はオペコードの結果を含む PHP 配列です。 od_dump_opcodes_file を例として、foo.php と同じディレクトリに別の bar.php を記述します。
$opcodes = od_dump_opcodes_file('./foo.php');
var_dump($opcodes);
?>
実行結果は以下の通りです:
配列(3) {
[0]=>
配列(8) {
["lineno"]=>
int(2)
["オペコード"]=>
string(11) "ZEND_ASSIGN"
["op1_type"]=>
文字列(2) "CV"
["op2_type"]=>
string(5) "CONST"
["result_type"]=>
string(0) ""
["op1"]=>
文字列(2) "~0"
["op2"]=>
string(5) "こんにちは"
["結果"]=>
string(0) ""
}
[1]=>
array(8) {
["lineno"]=>
int(3)
["オペコード"]=>
string(9) "ZEND_ECHO"
["op1_type"]=>
string(2) "CV"
["op2_type"]=>
string(6) "未使用"
["result_type"]=>
string(6) "未使用"
["op1"]=>
string(2) "~0"
["op2"]=>
string(6) "未使用"
["結果"]=>
string(6) "未使用"
}
[2]=>
array(8) {
["lineno"]=>
int(5)
["オペコード"]=>
string(11) "ZEND_RETURN"
["op1_type"]=>
string(5) "CONST"
["op2_type"]=>
string(6) "未使用"
["result_type"]=>
string(6) "未使用"
["op1"]=>
string(1) "1"
["op2"]=>
string(6) "未使用"
["結果"]=>
string(6) "未使用"
}
}
OpdumperのWebサービス务:Opcode Dumper
正直、PHP モジュールのインストールも大変です。そのため、友人がオペコードを閲覧できるように、私は Opdumper としてオンライン Web サービスを構築しました: http://supercompiler.com/app/opcode_dumper。
Web页面访问
このページにアクセスするだけで、PHP コードを入力または結合するだけで、対応するオペコード:
をすぐに確認できます。同時に、結果をローカル (CSV ファイル形式) にダウンロードすることもできます。
HTTP API 方式访问
次の API を通じて PHP コードのオペコードを取得できます:URI: http://supercompiler.com/api/dump_opcodes
メソッド: POST
パラメータ: php_script=[您的PHP代码]
戻り値は JSON 形式で、成功した場合は成功フィールドが "true"、データ フィールドがオペコードを保持します。失敗した場合は成功フィールドが "false"、メッセージ フィールドが失われます。
広範囲にわたる関係により、現在この API を Ajax 方式で制御するには Curl のみを使用できますが、その後 JSONP インターフェースが追加される可能性があります。
结语
現在、このモジュールは初期のものに比べて、完全に必要な場所が非常に多くあります。また、github から献呈された友人を歓迎しています。
翻訳链接:http://www.codinglabs.org/html/opdumper-and-web-opcode-dumper.html