Gmp PHP 扩展 - MAMP PRO

Gmp PHP extension - MAMP PRO

我已经查看了其他几个问题,例如 , guide like this or this,但我仍然没有运气。

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

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

21 年 7 月 8 日更新

我更新了 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.sophp.ini。重新启动 MAMP,phpinfo();

上没有任何新内容

21 年 7 月 12 日更新

根据 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 配置文件覆盖了 bash =41=]

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)。 None 他们产生了一个有效的 .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 运行time 环境,同时与扩展兼容.

使用默认配置启动PHP(无.ini文件),仅加载单个扩展二进制文件进行测试并显示配置信息, 运行:

$ 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 ';'

这将退出非零(退出状态)如果在标准错误和[=123=上加载扩展显示和错误消息时出现问题] 将以零状态退出,以防可以加载扩展:

$ 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 Warning: PHP Startup: Unable to load dynamic library 'gmp.so' (tried: <path> (dlopen(<path>, 9): no suitable image found. Did find: <path>: mach-o, but wrong architecture ...), <path> (dlopen(<path>.so, 9): image not found)) in Unknown on line 0

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


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


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

要获取 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-bit executable x86_64

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

然后比较应该显示差异。

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


结束语:

在 Apple Silicon M1 上,我对编译及其架构并没有特别深入的了解,其他人可以更好地讲述它。据我所见,您通过 运行ning brew 使用 arch(1) 实用程序将架构设置为 arch -x86_64 <command>x86_64。在 Apple Silicon 上,这可能需要更多工具,即 Rosetta.

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

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

因为 brew 有关于如何在系统上编译扩展的信息(brew formula, here for gmp),所以最直接的方法可能是使用它并 运行 在正确的架构下安装。

需要注意的是,您还需要使用 arch(1) 实用程序(以及 brew 安装)在(?)正确的体系结构中启动 brew。