PHP は Embed SAPI を提供します。つまり、PHP では、PHP/ZE が提供する関数を C/C++ 言語で呼び出すことができます。この記事では、Embed SAPI に基づいた PHP オペコード ビューアを実装します。
まず、コンパイル用のPHPソースコードをダウンロードします。私は現在PHP5.3 alpha2を使用しています
。
ソースコードディレクトリを入力してください:
./configure --enable-embed --with-config-file-scan-dir=/etc/php.d --with-mysql --with-config-file-path=/etc/
./作る
./make install
最後に、生成された libphp5.so をランタイム ライブラリのディレクトリに忘れずにコピーしてください。私はそれを /lib/ に直接コピーしました。そうしないと、独自の埋め込みプログラムを実行するときにエラーが報告されます。
./embed: 共有ライブラリのロード中にエラーが発生しました: libphp5.so: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありませんPHP の SAPI に詳しくない場合は、私の記事「Zend SAPI の詳細な理解 (Zend SAPI 内部)」を読むことをお勧めします
この時点で、C コードに PHP スクリプト パーサーを埋め込むことができます。私の例:
リーリー
リーリー
コンパイルと実行が正常に完了すると、標準出力に Hello World! が出力されることがわかります。これに基づいて、vld に似たオペコード ダンパーを簡単に実装できます。
まず、オペコード変換関数を定義します (すべてのオペコードは Zend/zend_vm_opcodes.h で確認できます)。
リーリー
次に、zval と znode の出力関数を定義します。
次に、op_array の出力関数を定義します。
リーリー最後に、プログラムの主な関数があります:
リーリーテスト スクリプト (sample.php) をコンパイルして実行します:
コードをコピーします コードは次のとおりです:
サンプル.php:
エコー「ラルエンス」;
コマンド:
コードをコピーします コードは次のとおりです:
./opcodes_dumper サンプル.php
出力結果を取得します (次の結果に混乱している場合は、私の記事「PHP 原則の深い理解: オペコード」を読むことをお勧めします):
スクリプト:sample.php
最適な行 結果
1 4 1 1
ZEND_RETURN
ふふ、どうですか?
http://www.bkjia.com/PHPjc/1069344.html