微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Gmp PHP 扩展 - MAMP PRO

如何解决Gmp PHP 扩展 - MAMP PRO

我已经查看了其他几个问题,例如 this onethisthis 之类的指南,但我仍然没有运气。

这是我到目前为止所做的:

  1. 使用 brew install autoconf gmp 下载带有 brew 的 gmp
  2. 从源下载 PHP(我使用的是 7.3.24 版)
  3. 已将 Gmp 目录复制到 /Applications/MAMP/bin/PHP/PHP7.3.24/include/PHP/ext
  4. 进入该目录并启动 PHPize
  5. 发布./configure --with-PHP-config=/Applications/MAMP/bin/PHP/PHP7.3.24/bin/PHP-config
  6. 发布make
  7. 发布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-configmakemake 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

如果你看这个 img,这很有趣

扩展名确实存在

猛禽:

这是您询问的命令的输出

[~]$ 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 将架构设置为 .soarch(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 举报,一经查实,本站将立刻删除。