Composer在M1/M2 Mac报“cannot execute binary file”是因为官方PHAR绑定x86_64 PHP,而ARM64无法运行;需统一使用Homebrew安装的arm64 PHP和Composer,并确保Docker镜像也为arm64架构。
为什么
在 M1/M2 Mac 上报 “cannot execute binary file”?
因为默认下载的 Composer PHAR 包里,
二进制依赖的是 x86_64 架构的 PHP,而 ARM64(Apple Silicon)无法直接运行 x86_64 的原生扩展或嵌入式解释器。这不是 Composer 本身的问题,而是它打包时绑定的 PHP 运行时不匹配。
现象:执行
或
报错
或卡在
后无响应
本质:Composer 官方 PHAR(如
)在构建时未启用跨架构兼容,且部分插件(如
)会尝试加载预编译的 x86_64 扩展
验证方式:运行
,输出含
表示 PHP 正确;若为
,说明你用的是 Rosetta 2 下的 Homebrew 或手动安装的旧版 PHP
用 Homebrew 安装 ARM64 原生 PHP + Composer 最简路径
绕过官方 PHAR,改用系统级包管理器统一架构,是最稳定、无需反复调试的方式。
先卸载可能冲突的 x86_64 PHP:
(如果存在)
确保 Homebrew 自身是 arm64 版本:
命令应输出
;如果不是,重装 Homebrew 到
安装 ARM64 PHP:
(自动装到
,带 arm64 扩展支持)
安装 Composer:
(此版本由 Homebrew 编译,调用本地
,不打包任何二进制)
验证:
应正常输出,且
能完成依赖解析与 autoload 生成
卡住或提示 “failed to open stream” 怎么办?
这通常不是架构问题,而是 Composer 默认用 HTTPS 访问 Packagist,但某些网络环境或 DNS 配置下,ARM64 PHP 的 cURL 扩展对 HTTP/2 或 TLS 1.3 握手更敏感,导致连接中断。
Trae mac
Trae Mac 官方版本现已全面适配 Apple Silicon(M1/M2/M3等)与 Intel 芯片,要求 macOS 12.0 及以上系统。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn)下载专属 .dmg 安装包,享受国内直连的极速稳定体验。
下载
临时降级协议:
(去掉
后的隐式 HTTP/2)
禁用并行下载(减少并发 TLS 连接压力):
和
如果项目含
或
等已废弃扩展的 require 声明,Composer 会尝试加载失败——检查
中
和
,移除不兼容或已移除的扩展名
注意:M2 Max/M2 Ultra 机型上,
可能导致
缓存误判,建议临时设为
测试
用 Docker 运行 Composer 时仍出错?检查容器内 PHP 架构
Docker Desktop for Mac 默认启用 Rosetta 2 兼容层,但镜像本身未必是 arm64。即使宿主机是 M2,拉取的
镜像可能是 x86_64,导致容器内
启动失败。
强制拉取 ARM64 镜像:
验证镜像平台:
输出应为
在容器中确认 PHP 架构:
应输出
不要在容器内用
—— 它下载的仍是通用 PHAR,可能不兼容。改用
(Alpine)或
(Debian),由包管理器保证架构一致
事情说清了就结束。最常被忽略的一点是:**PHP 和 Composer 必须同为 arm64,缺一不可;哪怕只有一方是 x86_64,错误就藏在底层指令集不匹配里,表面看是超时或权限问题,实际根本跑不起来。**
composer installphpcomposer --versioncomposer installzsh: cannot execute binary fileLoading composer repositories with package informationcomposer.pharhirak/prestissimofile $(which php)arm64x86_64arch -x86_64 brew uninstall phparcharm64/opt/homebrewbrew install php/opt/homebrew/bin/phpbrew install composerphpcomposer --versioncomposer installcomposer create-projectcomposer config -g repo.packagist.org.url https://packagist.orghttps://composer config -g process-timeout 300composer config -g use-include-path falseext-mcryptext-apcucomposer.jsonrequirerequire-devopcache.enable_cli=1create-project0php:8.2-clicomposerdocker pull --platform linux/arm64 php:8.2-clidocker inspect php:8.2-cli | grep Architecture"Architecture": "arm64"docker run --rm -it php:8.2-cli php -r "echo PHP_ARCH;arm64curl -sS https://getcomposer.org/installer | phpapk add composerapt-get install composer