【问题标题】:Gmp PHP extension - MAMP PROGmp PHP 扩展 - MAMP PRO
【发布时间】:2021-09-17 22:15:29
【问题描述】:

我已经查看了其他几个问题,例如 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

21 年 8 月 7 日更新

我更新了 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

如果你看看这张图片,这会很有趣 扩展确实存在

对于猛禽:

这是您询问的命令的输出。

[~]$ 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 cli 并且只加载扩展名(空白,-n)? php -n -d extension=gmp.so -i?如果加载 .so 文件时出现问题,它将显示在标准错误中。此外,它可能有助于验证从磁盘加载的确切文件的命令)。
  • 该命令是 php 并且 -n 开关告诉 php 不加载任何 .ini 文件 - 这对于简单的故障排除来说是一个空白。然后是-d 的配置参数,接下来是extension=gmp.so,它告诉php 加载您遇到问题的扩展。然后-i显示配置,你已经知道那个开关了。
  • 不确定是否必须使用 MAMP PRO,但 Homebrew 也有 PHP。如果您使用 Homebrew PHP 版本,您可以使用 PECL 轻松安装扩展。
  • 现在我在输出中看起来更好,它说“/Applications/MAMP/bin/php/php7.3.27/lib/php/extensions/no-debug-non-zts-20180731/gmp.所以:mach-o,但架构错误”所以该文件一定有问题。我有一台带有 M1 芯片的新 iMac。可能是这个原因吗?
  • 无论您使用的是 MAMP Pro 附带的 php 还是从源代码编译 php,您只需要确保 php 将使用的每个库都必须具有相同的架构和当您从源代码编译库时,架构可能会有所不同,当发生这种情况时,我们需要传递编译器标志以强制编译器针对特定架构构建库

标签: php macos php-extension gmp mamp-pro


【解决方案1】:

没有加载 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'(已尝试:&lt;path&gt; (dlopen(&lt;path&gt;, 9):找不到合适的图像。确实找到了:&lt;path&gt;: mach-o , 但是架构错误...), &lt;path&gt; (dlopen(&lt;path&gt;.so, 9): image not found)) 在 Unknown on line 0

这意味着文件在磁盘上可用(可以打开)但图像不合适,这意味着它与架构不匹配。


(在gmp.so.so 的尝试中存在一些噪音,这是由 php 完成的,因此可以通过 -d extension=gmp 而无需扩展直接工作,例如在 php-.ini 中同时工作 * nix (.so) 或 windows (.dll)。这部分可以忽略,即“找不到图像”,因为预期的文件不存在)


它必须与 PHP 本身的架构相同,因为 PHP 已经在运行并想要加载二进制扩展 - 它们需要适合。

要获取 PHP 的体系结构,请找到 PHP 命令:

$ which php
/Applications/MAMP/bin/php/php7.3.27/bin/php

这是 php 二进制文件的绝对路径。有了它,现在可以使用file(1) 实用程序获取有关它的更多信息:

$ 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

(或致电$ file "$(which php)" 以同时运行两者)

它显示了 php 二进制文件信息,包括。最后是x86_64 架构:

Mach-O 64 位可执行 x86_64

由于要加载的共享对象图像(编译后的 php 扩展名gmp.so 文件)也需要与之匹配,因此可以以相同的方式在编译后的扩展名.so 文件上使用相同的file(1) 实用程序。

然后比较应该显示差异。

有了这些信息,最终可以使用适当的架构编译扩展。


结束语:

在 Apple Silicon M1 上,我并不是特别擅长编译,它的架构和其他人可以更好地说明这一点。从我看到的情况来看,您通过使用arch(1) 实用程序将架构设置为arch -x86_64 &lt;command&gt; 运行brew 来管理它@ 987654356@。在 Apple Silicon 上,这可能需要更多工具,即 Rosetta

这似乎是 M1 用户的常见博客 (via Austen Cameron in Nov 2020),但这完全不是我的系统。

根据我自己的理解,应该可以使用编译器标志或在配置行上设置架构,通常就是这样。

由于 brew 提供了如何在系统上编译扩展的信息(brew formula, here for gmp),因此使用它并在正确的架构下运行安装可能是最直接的。

需要注意的是,您还需要使用 arch(1) 实用程序(以及 brew 安装)在 (?) 正确的架构中开始 brew。

【讨论】:

  • 我找到了解决方案,请编辑您的答案并添加所有详细信息,您甚至可以在此处找到部分故事(相关问题):stackoverflow.com/questions/68379240/…。一旦您更新答案,我将接受并给予奖励
  • @Diego:我可以使用file(1) 实用程序步骤跟踪正在进行的故障排除,以揭示 php 的体系结构,从而了解编译的 .so 文件的不同体系结构。之后,我假设您通过 brew 设置正确的架构进行了安装。到目前为止,我已经在答案中排除了具体命令,我可以想象有很多来回给你,但这里的具体点是架构不匹配,对吧?另一个问题是构建依赖项;)
  • 是的,我想你明白了。基本上这都是与拱门相关的问题,但一开始并不那么明显。也许带有 brew 的 M1 芯片仍在开发中,事情很快就会变得奇怪。无论如何,似乎是一个很好的答案。我会给奖励,我们可以结案
  • @Diego:你写它的那一刻是Apple M1,我也被它直接绕开了一点。或许那是另一种学习:在M1上用X86_64就可以了,一定不是ARM(只能是)。
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 2020-03-17
  • 2018-10-30
  • 2016-10-09
  • 2011-01-03
  • 2014-01-04
  • 2018-05-28
  • 2016-03-22
相关资源
最近更新 更多