PHP_FE_FUNCTION:尝试启用扩展时出现 C 错误

PHP_FE_FUNCTION:尝试启用扩展时出现 C 错误

我对 PHP 有疑问。我使用 Ubuntu,但我在 /opt/php 中自己构建了不同的 PHP 版本。我在启用扩展执行以下概要时遇到问题(使用 PHP 5.3.8)

cd my-ext
/opt/php/5.3.8/bin/phpize
./configure --args...
make
make install

我收到以下错误:

PHP_FE_END (undefined function)

来自日本博客和 PHP SVN 源(见下面的链接)

http://d.hatena.ne.jp/SeaHacker/20110825

http://marc.info/?l=php-cvs&m=131161504128077

显然,这个 hack 是用 来代替PHP_FE_FUNCTION{NULL,NULL,NULL},所以我在代码中添加了这段代码:

sed -i 's|PHP_FE_END|{NULL,NULL,NULL}|' /opt/php/5.3.8/ext/**/*.c
sed -i 's|ZEND_MOD_END|{NULL,NULL,NULL}|' /opt/php/5.3.8/ext/**/*.c

这修复了错误。但我不是 C 语言专家,所以我知道它可以工作,但我不知道为什么,所以这有点令人沮丧。有人能解释一下这个问题吗?

答案1

宏应该用“$PREFIX/include/php/main/php.h”中的PHP_FE_FUNCTION值来定义(对于您来说,$PREFIX 可能是 /opt)。应该定义为“Zend/zend_modules.h”。两者都是用于在声明变量时初始化变量值的初始化器。{NULL,NULL,NULL}ZEND_MOD_END{ NULL, NULL, NULL, 0 }

由于某种原因,为 PHP 5.3.8(可能还有其他版本)安装的这些标头的副本有时会缺少这些宏,尽管它存在于源分发版的标头中。用 替换宏是{NULL,NULL,NULL}可行的,因为,嗯,这就是 的值应该是什么PHP_FE_FUNCTION。因为ZEND_MOD_END它是可行的,因为如果初始化程序中的值少于数组元素/结构成员,则任何剩余的元素/成员都将被初始化为零(有关完整内容,请参阅 C99,§ 6.7.8-21)。例如:

int ii[10] = {NULL,NULL,NULL}; // ii[3] through ii[9] are 0
struct {
    int *pa, *pb, *pc,
        d,e,f;
} s = {NULL, NULL, NULL}; // s.d, .e, .f are 0

修复该错误的另一种方法是替换已安装的文件,这也可以修复构建其他扩展的问题:

  1. 将已安装的 main/php.h 与源中的副本进行比较,并查找不兼容的更改。只要源版本和已安装的版本相同,就不会有太多更改(我php_win32_docref2_from_error在 MS Windows 系统上观察到了声明)。
  2. 如果没有出现任何问题,请将源 main/php.h 复制到已安装的 php.h 上。

第二次替换(宏ZEND_MOD_END)仅适用于某些扩展,例如 imap。对于这些,您还可以重复 Zend/zend_API.h(用于ZEND_FE_END)和 Zend/zend_modules.h(用于ZEND_MOD_END)的替代修复。

答案2

也许“make script”在包含路径中找不到您的 php 版本的 main/php.h。(您可能在 /opt/php/5.3.8/includes 或其他地方包含了该文件)。

在大多数情况下,最好的方法是使用 php 安装的 php-config,请尝试以下操作:

./configure --with-php-config=/opt/php/5.3.8/bin/php-config

相关内容