如何解决Gmp PHP 扩展 - MAMP PRO
我已经查看了其他几个问题,例如 this one、this 或 this 之类的指南,但我仍然没有运气。
这是我到目前为止所做的:
- 使用
brew install autoconf gmp
下载带有 brew 的 gmp - 从源下载 PHP(我使用的是 7.3.24 版)
- 已将 Gmp 目录复制到
/Applications/MAMP/bin/PHP/PHP7.3.24/include/PHP/ext
- 进入该目录并启动
PHPize
- 发布
./configure --with-PHP-config=/Applications/MAMP/bin/PHP/PHP7.3.24/bin/PHP-config
- 发布
make
- 发布
make install
到目前为止,一切都很好。没有错误,一切似乎都很好,但是如果我查看 cli PHP -m
(或 PHP -i
)这一点,则没有加载 gmp 扩展。所以我去了我的 cli PHP.ini
文件和我的 web PHP.ini
文件并手动添加了 extension=gmp.so
(文件存在于这个路径 /Applications/MAMP/bin/PHP/PHP7.3.24/include/PHP/ext/gmp/modules/gmp.so
)。
我什至尝试指定完整路径,但仍然没有运气。我的 cli 或我的 PHPinfo();
都没有显示 GMP 已启用。我有点困惑 atm,无法考虑其他任何事情。
我错过了什么?显然,我重启了十几次 MAMP PRO,甚至是我的 Mac 本身。
- MacOs 版本:iMac 24' M1 上的 11.4 Big Sur
- MAMP PRO 版本:6.3.1
- 使用的 PHP 版本:7.3.24
更新 08/07/21
我更新了 MAMP PRO 并安装了 PHP 7.3.27 版,所以我又重新检查了一遍,从源 https://github.com/php/php-src/releases?after=php-8.0.4RC1 下载 PHP,将 ext/gmp 复制到
/Applications/MAMP/bin/PHP/PHP7.3.27/include/PHP/ext
,推出了 /Applications/MAMP/bin/PHP/PHP7.3.27/bin/PHPize
、./configure --with-PHP-config=/Applications/MAMP/bin/PHP/PHP7.3.27/bin/PHP-config
、make
和 make install
。没有错误。
make install
的输出是:
Installing shared extensions: /Applications/MAMP/bin/PHP/PHP7.3.27/lib/PHP/extensions/no-debug-non-zts-20180731/
Installing header files: /Applications/MAMP/bin/PHP/PHP7.3.27/include/PHP/
shtool:install:Warning: source and destination are the same - skipped
我通过 MAMP 界面、文件、编辑模板 -> PHP -> PHP7.3.27 将 extension=gmp.so
添加到 PHP.ini
。重新启动 MAMP,PHPinfo() 上没有任何新内容;
12/07/21 更新
根据 Hakre 的要求,我已将以下命令运行到 cli 中,结果如下:
[~]$ PHP -n -d extension=gmp.so -i
PHP Warning: PHP Startup: Unable to load dynamic library 'gmp.so' (tried: /Applications/MAMP/bin/PHP/PHP7.3.27/lib/PHP/extensions/no-debug-non-zts-20180731/gmp.so (dlopen(/Applications/MAMP/bin/PHP/PHP7.3.27/lib/PHP/extensions/no-debug-non-zts-20180731/gmp.so,9): no suitable image found. Did find:
/Applications/MAMP/bin/PHP/PHP7.3.27/lib/PHP/extensions/no-debug-non-zts-20180731/gmp.so: mach-o,but wrong architecture
/Applications/MAMP/bin/PHP/PHP7.3.27/lib/PHP/extensions/no-debug-non-zts-20180731/gmp.so: mach-o,but wrong architecture),/Applications/MAMP/bin/PHP/PHP7.3.27/lib/PHP/extensions/no-debug-non-zts-20180731/gmp.so.so (dlopen(/Applications/MAMP/bin/PHP/PHP7.3.27/lib/PHP/extensions/no-debug-non-zts-20180731/gmp.so.so,9): image not found)) in UnkNown on line 0
PHPinfo()
PHP Version => 7.3.27
猛禽:
这是您询问的命令的输出。
[~]$ which PHP
/Applications/MAMP/bin/PHP/PHP7.3.27/bin/PHP
[~]$ PHP --ini | grep "Loaded Configuration File"
Loaded Configuration File: /Applications/MAMP/bin/PHP/PHP7.3.27/conf/PHP.ini
[~]$ PHP --version
PHP 7.3.27 (cli) (built: Mar 16 2021 12:04:51) ( NTS )
copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.27,copyright (c) 1998-2018 Zend Technologies
[~]$
Ofc 安装了多个 PHP,因为 MAMP 单独用 4-5 版本填充它 + 有来自 MacOSx 的默认版本,我已经用 .zshrc bash 配置文件覆盖了
export PATH=/Applications/MAMP/bin/PHP/PHP7.3.27/bin:$PATH
该行来自我的 .zshrc
问题可能与新的 M1 芯片有关吗?我正在使用 2021 年 6 月末购买的新 iMac。 也许 is this 相关?
对于哈里达山:
让我开始说我尝试使用没有额外参数的 .configure,然后我尝试使用 CC="gcc -arch i386" CXX="g++ -arch i386" 甚至 CC="gcc -arch arm64" CXX="g++ -arch arm64"(我在 configure.log 中找到了 arm64)。如果我没有错过命令行中的任何其他信息,它们都没有产生有效的 .so。 关于你让我做的测试,结果如下:
[~]$ file /Applications/MAMP/bin/PHP/PHP7.3.27/bin/PHP
/Applications/MAMP/bin/PHP/PHP7.3.27/bin/PHP: Mach-O 64-bit executable x86_64
解决方法
未加载 PHP 扩展的原因可能有很多,但要直接指出原因(和修复)并不总是那么容易,因为从源代码编译到显示 phpinfo()
然后最终错过了扩展名很大。
首先获取真正的错误信息
缩短故障排除距离的一种方法是查看扩展程序是否可以被 PHP 加载,如果不能,则显示错误消息。
对此的常见测试是使用 CLI SAPI (PHP on the commandlineDocs),因为它允许在与扩展兼容的同时减少和更轻松地控制 PHP 运行时环境。
要使用默认配置(无 .ini
文件)启动 PHP,仅加载单个扩展二进制文件来测试并显示配置信息,请运行:
$ php -n -d extension=gmp.so -i
摘自OptionsDocs,还有php --help
:
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-i PHP information
这应该会引发错误(在标准错误的终端中显示)或在 PHP 信息输出中显示加载的扩展(在标准输出中)。
或者,要减少输出并仅检查错误,请使用 -r
命令行开关执行一个空的 PHP 语句:
-r <code> Run PHP <code> without using script tags <?..?>
有关 GMP 扩展的示例:
$ php -n -d extension=gmp.so -r ';'
如果在标准错误上加载扩展显示和错误消息时出现问题,这将退出非零(退出状态),并且会以零状态退出,以防万一可以加载扩展:
$ php -n -d extension=gmp.so -r ';'
PHP Warning: PHP Startup: Unable to load dynamic library 'gmp.so' (tried: /Applications/MAMP/bin/php/php7.3.27/lib/php/extensions/no-debug-non-zts-20180731/gmp.so (dlopen(/Applications/MAMP/bin/php/php7.3.27/lib/php/extensions/no-debug-non-zts-20180731/gmp.so,9): no suitable image found. Did find:
/Applications/MAMP/bin/php/php7.3.27/lib/php/extensions/no-debug-non-zts-20180731/gmp.so: mach-o,but wrong architecture
/Applications/MAMP/bin/php/php7.3.27/lib/php/extensions/no-debug-non-zts-20180731/gmp.so: mach-o,but wrong architecture),/Applications/MAMP/bin/php/php7.3.27/lib/php/extensions/no-debug-non-zts-20180731/gmp.so.so (dlopen(/Applications/MAMP/bin/php/php7.3.27/lib/php/extensions/no-debug-non-zts-20180731/gmp.so.so,9): image not found)) in Unknown on line 0
$ echo $?
254
如示例所示,错误已经在“PHP 启动”中,这是 PHP 发出诊断消息加载扩展的典型阶段。
Dlopen 9:找不到合适的图像:mach-o,但架构错误
上面的错误信息表明 a) PHP 首先无法加载扩展(作为动态库、.so
文件、共享对象 > 文件,即编译后的扩展名) 和 b) 由于找不到合适的图像而无法加载:
PHP 警告:PHP 启动:无法加载动态库“gmp.so”(尝试:<path>
(dlopen(<path>
,9):找不到合适的图像。找到:{{1 }}:mach-o,但错误的架构...),<path>
(dlopen(<path>
,9): image not found)) in Unknown on line 0
这意味着文件在磁盘上可用(可以打开)但图像不合适,这意味着它与架构不匹配。
(在尝试 <path>.so
时有一些噪音由 php 完成,因此可以通过 gmp.so.so
而无需扩展名直接工作,例如在 php-{{1} } 在 *nix (-d extension=gmp
) 或 windows (.ini
) 上工作。这部分可以忽略,即“找不到图像”,因为文件不存在,这是预期的)
它必须与 PHP 本身具有相同的架构,因为 PHP 已经在运行并且想要加载二进制扩展 - 它们需要适合。
要获取 PHP 的架构,请找到 PHP 命令:
.so
这是php二进制文件的绝对路径。有了它,现在可以使用 .dll
实用程序获取有关它的更多信息:
$ which php
/Applications/MAMP/bin/php/php7.3.27/bin/php
(或调用 file(1)
以同时运行两者)
它显示了 php 二进制文件信息,包括。末尾的 $ file /Applications/MAMP/bin/php/php7.3.27/bin/php
/Applications/MAMP/bin/php/php7.3.27/bin/php: Mach-O 64-bit executable x86_64
架构:
Mach-O 64 位可执行文件 x86_64
由于要加载的共享对象图像(编译后的 php 扩展 $ file "$(which php)"
文件)也需要匹配它,因此可以在编译后的扩展 x86_64
文件中使用相同的 gmp.so
实用程序同样的方式。
然后比较应该显示差异。
有了这些信息,最终可以使用适当的体系结构编译扩展。
结束语:
在 Apple Silicon M1 上,我对编译和它的架构没有特别深刻的了解,其他人可以更好地说明它。据我所知,您通过使用 file(1)
实用程序运行 brew 将架构设置为 .so
到 arch(1)
来管理它。在 Apple Silicon 上,这可能需要更多工具,即 Rosetta。
这似乎是 M1 用户博客上常见的内容(via Austen Cameron in Nov 2020),但这完全不是我的系统。
根据我自己的理解,应该可以使用编译器标志或在配置行上设置架构,通常就是这样。
由于 brew 具有如何在系统(brew formula,here for gmp)上编译扩展的信息,因此使用它并在正确的架构下运行安装可能是最直接的。
需要注意的是,您还需要使用 arch -x86_64 <command>
实用程序(以及 brew 安装)在 (?) 正确架构中启动 brew。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。