php - 在编译期间检测 PHP 是否正在使用给定的扩展名进行编译

标签 php c php-internals

我正在尝试为 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/

相关文章:

PHP 内部 : Where are Arrays Created

php - 令人费解的php解析器错误

php - 为什么当 PHP 数组的元素是引用分配时它会被修改?

php - mysql PDO如何绑定(bind)LIKE

php - 这个 SOAP 错误是否如我所想的那样?

PHP对象像数组

c - 如何解决堆栈损坏错误?

php - 上传时将文件重命名为 input.mp4 不起作用

c - 如何将十六进制字符串解释为C中的字符串

c - C 语言的生命游戏问题