composer如何在ARM架构(如M1 Mac)上运行?(兼容性问题处理)

4次阅读

composer 在 m1/m2 mac 上卡住或报 illegal instruction: 4,根本原因是 php 或其扩展非 arm64 原生架构;必须确保 php、openssl 等扩展均为 arm64 构建,并正确配置 openssl.cafile。

composer如何在ARM架构(如M1 Mac)上运行?(兼容性问题处理)

Composer 可以在 ARM 架构(如 M1/M2 Mac)上原生运行,但默认安装的 x86_64 版本会因架构不匹配而报错或卡死——必须确保 PHP 和 Composer 都是 ARM64 原生构建。

为什么 composer install 在 M1 Mac 上卡住或报 Illegal instruction: 4

这是典型的二进制架构错配:你用 Rosetta 2 运行了 x86_64 的 PHP,又装了 x86_64 的 Composer Phar,但某些扩展(如 opensslcurl)底层调用失败,触发非法指令。ARM Mac 上的 PHP 必须是 Apple Silicon 原生编译的(arm64),否则 Composer 的依赖解析、https 请求、phar 解包等环节都可能崩。

  • 检查当前 PHP 架构:file $(which php) —— 输出含 arm64 才安全
  • 如果显示 x86_64,说明你在 Rosetta 下跑,哪怕终端标着“已优化”,也别信
  • Homebrew 默认为 ARM 安装,但如果你曾手动装过 brew install --x86_64 php 或混用 Intel Homebrew,就埋了坑

如何确认并安装 ARM 原生的 Composer

Composer 本身是 PHP 脚本,但官方发布的 composer.phar 是纯 PHP,不带架构绑定;真正决定能否跑通的是它依赖的 PHP 运行时和扩展。所以重点不是“重装 Composer”,而是“确保它跑在对的 PHP 上”。

  • 卸载旧版:sudo rm /usr/local/bin/composer(如果存在)
  • 用 ARM PHP 下载:php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
  • 校验哈希(跳过易出错,除非你真需要):官网每次发布页有最新 SHA384
  • 安装:php composer-setup.php --install-dir=/usr/local/bin --filename=composer
  • 验证:composer --versionphp -m | grep openssl 都得成功返回

常见连带问题:PHP 扩展缺失或非 ARM 版

M1 Mac 上最常翻车的是 mbstringxmlzipopenssl 这几个 Composer 硬依赖扩展。它们若被编译成 x86_64,即使 PHP 主体是 arm64,加载时也会静默失败或报 undefined symbol

  • php -i | grep extension_dir 看扩展路径,再 ls -l 看里面 .so 文件的架构:file *.so
  • Homebrew 安装的 PHP(brew install php)默认带全扩展,且全是 arm64 —— 这是最省心的路径
  • 避免用 MacPorts、XAMPP、MAMP 自带 PHP;它们多数仍为 Intel 编译,且不更新
  • 如果你用 phpbrewasdf,务必指定 --arch=arm64 或使用 arm64 版本定义(如 asdf install php ref:8.3.6 要确认该 ref 支持 arm64)

遇到 curl Error 60 或 SSL 握手失败怎么办

这不是 Composer 问题,是 ARM PHP 的 openssl 扩展没正确链接到系统证书束。Apple Silicon 的 macOS 不再把证书放在 /etc/ssl/cert.pem,而 Homebrew 的 OpenSSL 默认也不自动配置路径。

  • 先查 PHP 的 cafile:php -r "print_r(openssl_get_cert_locations());",看 default_cert_file 路径是否存在
  • 若为空或指向错误路径,临时修复:export PHP_OPENSSL_CAFILE="/opt/homebrew/etc/openssl@3/cert.pem"(Homebrew OpenSSL 3 路径)
  • 更稳妥做法:在 php.ini 中加一行:openssl.cafile=/opt/homebrew/etc/openssl@3/cert.pem
  • 别用 curl.cainfo,Composer 不读这个;只认 openssl.cafile

最麻烦的点往往不在 Composer 本身,而在你以为“PHP 能跑命令就行”的那部分——比如某个扩展是 Rosetta 下编译的,或者 php.ini 加载了错误架构的 .so。只要有一个扩展不对,Composer 就可能在某个随机步骤崩掉,而且错误信息完全不提示架构问题。

text=ZqhQzanResources