Apple Silicon Mac 必须用 frankenphp-darwin-arm64.tar.gz,下错报 exec format error 或 Bad CPU type;需绕过 Gatekeeper 并用 file 验证 arm64 架构。

FrankenPHP 1.0 的 ARM64 版本在 Apple Silicon(M1/M2/M3/M4)Mac 上运行,关键就三点:下对包、绕过 Gatekeeper、确认架构匹配。不是装不上,而是 macOS 安全机制和架构错配共同导致“打不开”或“Operation not permitted”。
必须下载 frankenphp-darwin-arm64.tar.gz
官方从 v1.0.0 起已停止提供通用二进制(fat binary),只分发单一架构包:
- M1/M2/M3/M4 Mac → 只能用 frankenphp-darwin-arm64.tar.gz
- Intel Mac → 只能用 frankenphp-darwin-amd64.tar.gz
- 二者完全不兼容;下错会直接报 exec format error 或 Bad CPU type in executable
验证方式:解压后执行 file frankenphp,输出中必须含 arm64(例如:Mach-O 64-bit executable arm64)。若出现 x86_64,说明包下错了。
绕过 macOS Gatekeeper 拦截
即使 chmod +x,也无法执行——因为 Apple Silicon Mac 默认拒绝未公证(notarized)的独立二进制。这是系统级限制,不是权限问题。
立即学习“PHP免费学习笔记(深入)”;
-
推荐首次运行:在 Finder 中右键点击
frankenphp→ 选择“打开” → 点“仍要打开”。系统仅对该文件临时豁免,后续可正常./frankenphp -
适合脚本/重复使用:执行
xattr -d com.apple.quarantine frankenphp(仅对 Safari/Chrome 下载的文件有效) -
开发机可选:禁用 Gatekeeper(
sudo spctl --master-disable),但生产环境严禁启用“任何来源”
运行前再确认两个隐藏前提
绕过 Gatekeeper 后仍失败?大概率是这两个被忽略的细节:
-
检查是否被同名脚本覆盖:运行
which frankenphp,再执行file $(which frankenphp)。输出必须是Mach-O 64-bit executable arm64;若显示shell script,说明 PATH 里有冲突脚本,删掉或重命名 -
检查动态库依赖:用
otool -L frankenphp查看链接项。如出现libbpf.dylib not found(常见于启用 QUIC 的构建),需通过brew install libbpf补齐
整个过程不依赖 Homebrew 编译,也不需要 Rosetta 转译。原生 arm64 二进制启动快、无兼容层开销,这才是 Apple Silicon Mac 上跑 FrankenPHP 的正确姿势。



















