1

PHPの拡張機能を構築しようとしています。Sara Golemon の本を読んだ後、共有モジュールとしてコンパイルできる基本的な拡張機能を手に入れました。さらに、PHP 自体に沿って静的にコンパイルすることもできます。

ここで、特定の内部関数呼び出しをインターセプトし、これらの呼び出しを拡張機能に伝えるために、PHP インタープリターを変更したいと考えています。これは、拡張機能が PHP で静的にコンパイルされている場合にのみ実行したいと考えています。それ以外の場合は、インタープリターのビルド プロセスで変更されていない PHP バイナリが生成されます。私の理解では、C プリプロセッサを使用する必要があります。ただし、私の目標を達成するには、PHP が拡張機能を使用してコンパイルするように構成されている場合にのみ発生するプリプロセッサ フラグが必要です(つまり、./configure --enable-myextension)。残念ながら、そのようなフラグは見つからず、configure スクリプトによって設定されているようにも見えません。

ここで、拡張機能のコード内でプリプロセッサ フラグを設定しようとしましたが、うまくいきません。私の拡張機能は、ビルド プロセスの後半 (つまり、インタープリターのコアのほぼ後) で最初に触れられ、そこで設定したフラグは、インタープリター コードの大部分がコンパイルされているときにアクティブではありません。

何かご意見は?上記は合理的に聞こえますか?

4

1 に答える 1

0

私の理解では、C プリプロセッサを使用する必要があります。

いいえ、それは必要ありません。

PHP が拡張機能でコンパイルするように構成されている場合にのみ発生するプリプロセッサ フラグが必要です。

なぜあなたはそれをしたいですか?拡張機能のコンパイル方法に関係なく、関数呼び出しをフックすることは可能ですが、基本的に拡張機能を人為的に制限します。

上記は合理的に聞こえますか?

私の意見では、それは合理的ではありません。AOP が関数呼び出しをフックする方法をご覧ください: https://github.com/AOP-PHP/AOP

関数呼び出し以上のものをフックする必要がある場合は、zend_set_user_opcode_handler(). lxr.php.net または同様のツール (fgrep など) を使用して、そのようなハンドラーがどこでどのように使用されているかを調べてください。laruence が昨年ここで興味深い拡張機能に懸命に取り組んでいたことを知っています: http://svn.php.net/viewvc/pecl/taint/trunk/taint.c?view=markupその間に何か変更があった場合は、参照として物事を行う方法。

于 2013-01-29T09:51:03.067 に答える