在编译期间检测是否正在使用给定扩展编译PHP

时间:2013-01-28 19:58:31

标签: php c php-internals

我正在尝试为PHP构建扩展。按照Sara Golemon的书后,我有一个基本扩展,我可以编译为共享模块,此外,我可以在PHP本身静态编译它。

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

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

有什么想法?上述声音合理吗?

1 个答案:

答案 0 :(得分: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所以如果有任何改变的话,我会把它作为最“最新”的做事方式作为参考。