解决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

相关文章

如何在PHP框架Workerman中实现异步任务处理

在现代Web应用中,处理繁重的业务逻辑时,避免主业务流程被长时间阻塞是非常重要的。Workerman是一个高性能的PHP Socket框架,支持异步任务处理,可以有效地解决这一问题。本文将详细介...

PHP中使用CURL下载远程超大文件的方法

在使用PHP进行开发时,我们经常需要从远程服务器下载文件。当文件体积较大时,普通的文件操作和cURL方法可能会因为内存限制或执行时间限制而失败。本文将介绍如何使用PHP中的cURL扩展来高效地下...

macOS下对现有 DMG 文件进行空间扩容

在macOS下对现有的DMG文件进行空间扩容,可以通过使用hdiutil命令来实现。具体步骤如下:打开终端应用。使用hdiutil resize命令来调整DMG文件的大小。例如,如果你想将一个名...

PHP命名空间使用详解

在 PHP 中,命名空间(Namespace)是一种将相关的类、函数和常量组织到一个逻辑分组中的方式。它有助于避免命名冲突,并提高代码的可维护性和可扩展性。一、命名空间的定义使用 namespa...

复习一下PHP中的类和对象

面向对象编程(OOP)是一种编程范式,它通过类和对象的概念来组织代码。PHP 作为一种广泛使用的服务器端脚本语言,从 PHP 5 开始就全面支持面向对象编程。本文将深入探讨 PHP 中类和对象的...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件