解决macOS下M系列芯片编译PHP(pcntl、redis、swoole等)扩展加载出错的问题

在 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

相关文章

PHP中利用 popen 和 pclose 实现多进程的简单方案

在 PHP 中,popen 和 pclose 函数用于打开一个指向进程的管道,并允许你通过该管道与进程进行通信。popen 函数会启动一个新的进程,并返回一个文件指针,你可以通过该指针读取或写入...

macOS下使用UTM安装Alpine Linux虚拟机

在macOS下使用UTM(Universal Turing Machine)安装Alpine Linux虚拟机是一个相对简单的过程,但需要一些基本的配置和步骤。以下是详细的指南,涵盖了从安装UT...

Typecho插件开发手册

插件的基本结构在 Typecho 中,插件通常是一个独立的 PHP 文件,默认放置在usr/plugins/目录下。插件文件名即为插件名,插件类名也应与文件名相同。插件必须实现 Typecho_...

Typecho博客系统的xmlrpc的使用附PHP示例代码

XML-RPC 是一种远程过程调用(RPC)协议,它使用 XML 编码请求和响应,并通过 HTTP 进行传输。XML-RPC 允许客户端调用远程服务器上的方法,并获取返回结果。这种协议简单、轻量...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件