解决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')), ...

error.png

这种错误通常是由于编译时选择了错误的架构导致的。本文将提供解决方案,确保你能够在正确的架构下编译和安装 PHP 扩展。

2. 解决方案思路

2.1 确认架构

首先,确认你的 macOS 系统架构。你可以通过以下命令查看:

uname -m
  • 如果输出是 arm64,则表示你的系统是 ARM 架构(如 Apple Silicon)。
  • 如果输出是 x86_64,则表示你的系统是 x86_64 架构。

2.2 下载 PHP 源码

确保你下载的 PHP 源码包与本地安装的 PHP 版本一致。你可以从 PHP 官方网站下载对应的源码包。

2.3 解压并编译

其核心价值就在 arch -arm64arch -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 -arm64arch -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都已经正常配置

标签: PHP, macOS

相关文章

Memcached如何配置分布式使用 并附PHP示例

Memcached是一种高性能的分布式内存对象缓存系统,广泛用于加速动态Web应用程序。通过将数据存储在内存中,Memcached能够显著减少数据库负载,提高应用的响应速度Memcached分布...

使用PHP打造轻量级单文件SQLite数据库管理工具

先声明一下,这是我自己内网使用的一个简单的管理工具,所以安全性方面我肯定是没有测试的~ 如果你要放在公网,请添加相关的权限认证及sql防注入等处理在开发过程中,我们经常需要一个简单易用的数据库管...

PHP 中的 declare 指令

在 PHP 编程中,declare 指令是一个强大的工具,用于控制代码的执行行为。它不仅可以启用严格类型模式,还可以用于其他一些高级功能,如性能监控和字符编码。本文将深入探讨 declare 指...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件