Gmp PHP 扩展 - MAMP PRO
Gmp PHP extension - MAMP PRO
我已经查看了其他几个问题,例如 , guide like this or 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
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-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();
上没有任何新内容
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
对于猛禽:
这是您所要求的命令的输出。
[~]$ 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。
我已经查看了其他几个问题,例如
这是我到目前为止所做的:
- 已使用
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
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-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();
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
对于猛禽:
这是您所要求的命令的输出。
[~]$ 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。