1

我正在尝试为 PHP 构建一个扩展。在遵循 Sara Golemon 的书之后,我有了一个基本扩展,我可以将其编译为共享模块,此外,我可以沿着 PHP 本身静态编译它。

现在我想修改 PHP 解释器以拦截特定的内部函数调用并将这些调用传达给我的扩展。我只想在我的扩展使用 PHP 静态编译时才这样做——否则解释器构建过程应该生成一个未修改的 PHP 二进制文件。我的理解是我应该使用 C 预处理器。然而,为了实现我的目标,我需要一个预处理器标志,它只会在 PHP 配置为使用我的扩展进行编译时引发(即 ./configure --enable-myextension)。不幸的是,我找不到这样的标志,配置脚本似乎也没有设置。

我应该在这里说,我已经尝试在我的扩展程序代码中设置 preprossessor 标志,但这不起作用。我的扩展在构建过程的后期首次被触及(即大致在解释器核心之后),并且在编译大量解释器代码时,我在那里设置的标志是不活动的。

有什么想法吗?以上听起来合理吗?

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 回答