解决macOS下M系列芯片编译PHP(pcntl、redis、swoole等)扩展加载出错的问题
我本地用的是EServer这个服务器套件(这货编译的PHP居然是x86_64的),但是我的macOS是M系列的芯片arm64架构,所以我开始编译的组件加载不正常,出现了下面的那个错误,EServer的编译脚本只make的时候设置了环境,不知道为什么编译出来的依旧不能用,于是就有了这篇文章,我开始编译的是arm64,我想着我的芯片是arm架构的,肯定错不了,结果我错了....哈哈哈
在 macOS 上使用 M 系列芯片(如 Apple Silicon)时,编译 PHP 扩展可能会遇到架构不兼容的问题。本文将详细介绍如何解决这些问题,并提供在 ARM 和 x86_64 架构下编译 PHP 扩展的完整教程。
1. 问题背景
在 macOS 上使用 M 系列芯片(如 Apple Silicon)时,编译 PHP 扩展成功后,但是在使用php -m
的时候,则会提示加载出错,通常见到的错误信息如下
PHP Warning: PHP Startup: Unable to load dynamic library 'pcntl.so' (tried: /server/software/php/php-8.3/lib/php/extensions/no-debug-non-zts-20230831/pcntl.so (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')), ...
这种错误通常是由于编译时选择了错误的架构导致的。本文将提供解决方案,确保你能够在正确的架构下编译和安装 PHP 扩展。
2. 解决方案思路
2.1 确认架构
首先,确认你的 macOS 系统架构。你可以通过以下命令查看:
uname -m
- 如果输出是
arm64
,则表示你的系统是 ARM 架构(如 Apple Silicon)。 - 如果输出是
x86_64
,则表示你的系统是 x86_64 架构。
2.2 下载 PHP 源码
确保你下载的 PHP 源码包与本地安装的 PHP 版本一致。你可以从 PHP 官方网站下载对应的源码包。
2.3 解压并编译
其核心价值就在 arch -arm64
或arch -x86_64
,至于文章中的PHP版本、扩展版本、安装路径不在本文讨论范围内
2.3.1 ARM 架构
如果你的系统是 ARM 架构,请按照以下步骤进行编译:
# 解压源码包
tar -xzf php-8.2.21.tar.gz
cd php-8.2.21/ext/pcntl
# 生成配置文件
phpize
# 配置编译选项
arch -arm64 ./configure --with-php-config=/usr/local/bin/php-config
# 开始编译安装
arch -arm64 sudo make
arch -arm64 sudo make install
2.3.2 x86_64 架构
如果你的系统是 x86_64 架构,请按照以下步骤进行编译:
# 解压源码包
tar -xzf php-8.2.21.tar.gz
cd php-8.2.21/ext/pcntl
# 生成配置文件
phpize
# 配置编译选项
arch -x86_64 ./configure --with-php-config=/usr/local/bin/php-config
# 开始编译安装
arch -x86_64 sudo make
arch -x86_64 sudo make install
2.4 配置 php.ini 文件
编译安装完成后,需要在 php.ini
文件中添加以下配置,以启用 pcntl 扩展:
extension=pcntl.so
3. 常见错误及解决方法
3.1 架构选择错误
如果你在编译或运行时遇到架构不兼容的错误,请确保你在编译时使用了正确的架构命令(例如 arch -arm64
或 arch -x86_64
)。
3.2 编译错误
如果你在编译时遇到错误,可以尝试以下方法:
- 确保你已经安装了所有必要的依赖项。
- 使用
make -j4
命令进行多线程编译,但要注意架构选择是否正确。
arch -x86_64 make -j4
3.3 pcre2的问题,arm64中可能缺少这个header文件,做个软链就成,后面为你的php安装目录的inclue目录对应的位置...
ln -s /opt/homebrew/include/pcre2.h /server/php/php-8.3/include/php/ext/pcre/pcre2.h
如果没有pcre2
的话,直接brew install pcre
即可
通过以上步骤,你应该能够在 macOS 上使用 M 系列芯片时成功编译和配置 PHP 的 pcntl 扩展。如果在安装过程中遇到问题,请仔细检查架构选择和路径配置,并确保所有依赖项已正确安装。当然我本地测试的时候redis、swoole都已经正常配置
版权声明:本文为原创文章,版权归 全栈开发技术博客 所有。
本文链接:https://www.lvtao.net/system/macos-build-php-extensions-load-error.html
转载时须注明出处及本声明