运行file $(which frankenphp)和uname -m对比输出:若前者显示x86-64而后者为arm64(或反之),即确认cpu架构不匹配,导致exec format error。

这是典型的 CPU 架构不匹配,不是权限或路径问题,chmod +x 或重装无法解决。
怎么确认是架构不匹配?
运行 file $(which frankenphp),看输出里是否含 ELF 64-bit LSB pie executable, x86-64(Intel/AMD)或 aarch64(ARM64)。再对比宿主系统架构:
- macOS 上用
uname -m:返回arm64表示 Apple Silicon;x86_64表示 Intel - Linux 上同样用
uname -m,常见值为x86_64、aarch64、armv7l - Docker 中则需看镜像基础层:
docker inspect dunglas/frankenphp | grep Architecture
若二者不一致(比如 M2 Mac 上运行 x86-64 二进制),就是 exec format error 的直接原因。
下载时就选对架构的二进制
FrankenPHP GitHub Releases 页面(如 https://github.com/dunglas/frankenphp/releases)每个版本都提供多架构包。注意文件名后缀:
-
frankenphp-darwin-amd64→ Intel macOS -
frankenphp-darwin-arm64→ Apple Silicon macOS -
frankenphp-linux-amd64→ x86-64 Linux -
frankenphp-linux-arm64→ ARM64 Linux(树莓派、AWS Graviton 等)
别直接 curl https://frankenphp.dev/install.sh | sh——脚本默认只拉 amd64 版,M1/M2 用户必须手动指定 URL。例如:
curl -L -o frankenphp https://github.com/dunglas/frankenphp/releases/download/v1.2.0/frankenphp-darwin-arm64 chmod +x frankenphp sudo mv frankenphp /usr/local/bin/
Docker 场景下避免模拟运行
在 Apple Silicon 或 ARM 服务器上运行 docker run dunglas/frankenphp 报 exec format error,说明你拉的是 x86-64 镜像。解决方式只有两个:
- 显式拉取 ARM 镜像:
docker pull dunglas/frankenphp:latest-arm64(注意 tag 后缀) - 或让 Docker 自动适配:启动时加
--platform linux/arm64,例如:docker run --platform linux/arm64 -v $(pwd):/app dunglas/frankenphp console - 不推荐启用 QEMU 模拟(
tonistiigi/binfmt)——FrankenPHP 启动慢、QUIC 和 BPF 功能可能异常,仅作临时验证
为什么 Homebrew 安装有时也报这个错?
Homebrew 默认从源码编译,所以通常能生成本地架构二进制。但如果你用了 brew install --binary 或 bottle 缓存被污染,就可能装上错架构的预编译包。此时:
- 先删掉:
brew uninstall frankenphp - 清空 bottle 缓存:
rm -rf $(brew --cache)/frankenphp - 重装并强制编译:
brew install --build-from-source frankenphp - 验证:
file $(which frankenphp)输出应与uname -m一致
架构错配是硬性限制,内核拒绝加载,没有“绕过”一说。下载、安装、Docker 运行三个环节都得盯住 arch 这个关键词,漏一处就失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











