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

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,但某些扩展(如 openssl、curl)底层调用失败,触发非法指令。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 --version和php -m | grep openssl都得成功返回
常见连带问题:PHP 扩展缺失或非 ARM 版
M1 Mac 上最常翻车的是 mbstring、xml、zip、openssl 这几个 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 编译,且不更新
- 如果你用
phpbrew或asdf,务必指定--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 就可能在某个随机步骤崩掉,而且错误信息完全不提示架构问题。










