我正在尝试为 PHP 构建一个扩展。在遵循 Sara Golemon 的书之后,我有了一个基本的扩展,我可以将其编译为共享模块,此外,我还可以沿 PHP 本身对其进行静态编译。
现在我想修改 PHP 解释器以拦截特定的内部函数调用并将这些调用传递给我的扩展。只有当我的扩展是用 PHP 静态编译时,我才想这样做——否则解释器构建过程应该生成一个未修改的 PHP 二进制文件。我的理解是我应该使用 C 预处理器。然而,为了实现我的目标,我需要一个预处理器标志,只有当 PHP 配置为使用我的扩展进行编译时才会引发该标志(即 ./configure --enable-myextension)。不幸的是,我找不到这样的标志,配置脚本似乎也没有设置。
我应该在这里说,我已经尝试在我的扩展代码中设置预处理器标志,但这行不通。我的扩展在构建过程的后期才第一次被触及(即大致在解释器的核心之后),并且在编译大量解释器代码时我在那里设置的标志未激活。
有什么想法吗?以上听起来合理吗?
最佳答案
My understanding is that I should use the C preprocessor.
不,你不需要那个。
I need a preprocessor flag that will only be raised when PHP is configured to compile with my extension
你为什么想要那个?它基本上会人为地限制您的扩展的功能,尽管无论您的扩展如何编译都可以 Hook 函数调用。
Do the above sound reasonable?
在我看来,这是不合理的。请看一下 AOP 如何 Hook 函数调用:https://github.com/AOP-PHP/AOP
如果您需要 Hook 的不仅仅是函数调用,您需要使用 zend_set_user_opcode_handler()
到达最低级别,即操作码。请使用 lxr.php.net 或类似工具(fgrep 等)找出此类处理程序的使用位置和方式。我知道 laruence 去年在这里努力进行一个有趣的扩展:http://svn.php.net/viewvc/pecl/taint/trunk/taint.c?view=markup因此,如果在此期间发生任何变化,我会将其作为最“最新”的做事方式作为引用。
关于php - 在编译期间检测 PHP 是否正在使用给定的扩展名进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14570140/