如何在交叉编译的PHP上使用动态加载的扩展


How to use dynamically loaded extensions on cross-compiled PHP?

我已经为ARM平台编译了PHP。我现在正试图动态加载一个扩展,我已经通过PHP.ini (extension=…)为ARM编译。但是,扩展没有被加载,也没有错误报告。

我检查过的东西:

    PHP正在读取正确的PHP.ini文件使用-i选项可以看到PHP.ini文件所做的更改
  • -d "extension=…",没有加载扩展,没有错误。
  • enable_dl=1, dl(…)从命令行不工作("动态模块在命令行代码中不支持")

PHP使用以下选项编译:

./configure --host=arm-linux --target=arm -prefix=/php-5.5.8/_install --with-sqlite3 --without-pdo-sqlite --without-pear --disable-mbregex --enable-sockets --enable-fpm --enable-json --enable-session --enable-filter --disable-opcache --disable-libxml --disable-simplexml --without-zlib --disable-all

这是否与——disable-all选项有关?是否需要做一些事情来启用动态扩展(即使使用enable_dl,我也无法从命令行运行dl(…))?我必须静态编译我的扩展到PHP?

编辑:静态链接扩展工作良好。这不是延期的问题。但是,如果能够动态加载扩展,那就更理想了。

当您尝试交叉编译PHP时,configure脚本可能会禁用扩展的支持。

你可以检查交叉编译的CLI

:~>php -i |grep Dynamic
Dynamic Library support not available<br />.

如果你想使用扩展,你有2种方式:-破解配置脚本手动启用扩展的支持,绕过检查-为目标系统使用本机编译器

我使用第二个,成功地在Arm上加载扩展与本地编译的PHP 5.3.28

本地编译的CLI

:~>php -i |grep Dynamic
Dynamic Library Support => enabled

在交叉编译到freetz php包的mips时遇到同样的问题终于找到一个busybox补丁

他们的解决方案是

  1. 补丁/ext/opcache/配置。m4 autoconf宏
  2. 添加一些与shm相关的编译器标志到它们的makefile

此外,i也从第3968行开始php-5.6.40/aclocal.m4:

  • # https://bugs.php.net/bug.php?id=49314 if test "$cross_compiling" = yes; then : [$4]
  • 使用-all-static静态编译php-cgi

…经过长时间的搜索,这个问题解决了。希望在这里发帖可以帮助到其他人。欢呼,托尔斯滕

以下是与此问题相关的bug报告:https://bugs.php.net/bug.php?id=60109

下面的解决方案似乎解决了这个问题:

export CFLAGS="$CFLAGS -DHAVE_LIBDL"
export LDFLAGS="$LDFLAGS -ldl"