frankenphp官方自v1.0起已移除build-static.sh脚本,唯一支持的静态构建方式是通过nix:执行nix build .#frankenphp-x86_64-linux,产物为真正静态二进制,需用ldd验证“not a dynamic executable”。

build-static.sh 脚本实际不适用于 FrankenPHP
FrankenPHP 官方从 v1.0 开始就不再提供或维护 build-static.sh 脚本——它早已被移除。你如果在仓库里看到这个文件,大概率是旧版残留、fork 分支自建的脚本,或是误把其他项目(比如 Caddy 或某些 PHP 打包工具)的构建逻辑混进来了。
官方推荐且唯一支持的构建方式是通过 Nix:用 nix build 拉取预定义的 flake,生成完全静态链接的二进制。这不是“可选方案”,而是当前事实标准。
为什么不能靠自己写 shell 脚本硬编译
FrankenPHP 依赖大量深度集成组件:
-
php本身需启用--enable-embed=static,且所有扩展(如openssl、curl、zlib)必须静态编译进主二进制,不能留动态 .so -
nginx内核被重写为 Go 可调用的 C API 层,其 event loop 和 HTTP parser 与 PHP 运行时共享内存布局 -
libsqlite3、libonig、libargon2等底层库需全静态链接,且版本必须与 PHP 构建时一致 - Go 部分(
frankenphp主程序)需用CGO_ENABLED=0+ 静态 libc 替代(musl)交叉编译,否则无法真正静态
这些条件靠一个 shell 脚本协调几乎不可能稳定达成,稍有版本/flag 不匹配就会出现 undefined symbol 或运行时 panic。
正确做法:用 Nix 构建(macOS/Linux 均可)
确保已安装 nix(>= 2.18)并启用 flakes:
sh nix --version # 应输出 >= 2.18 nix run nixpkgs#nixFlakes --help # 确认 flakes 支持正常
然后执行:
sh git clone https://github.com/dunglas/frankenphp cd frankenphp nix build .#frankenphp-x86_64-linux --no-link
构建完成后,二进制位于:
result/bin/frankenphp
验证是否真静态:
ldd result/bin/frankenphp # 应输出 "not a dynamic executable"
注意:
- macOS 用户需改用
.#frankenphp-aarch64-darwin或.#frankenphp-x86_64-darwin - 若提示
error: unknown hash algorithm 'sha256',说明 Nix 版本太低,必须升级 - 构建过程会下载 ~2GB 缓存(含完整 PHP + nginx + Go toolchain),首次较慢,后续复用快
想跳过 Nix?只能用官方预编译二进制
如果你只是需要一个可用的静态 frankenphp,最省事的方式是直接下载 GitHub Releases 页面的 frankenphp_*.tar.gz 包。里面每个归档都已由 CI 用 Nix 构建完成,经过 strip 和 upx(可选)压缩,可直接运行:
curl -L https://github.com/dunglas/frankenphp/releases/download/v1.2.0/frankenphp_1.2.0_linux_x86_64.tar.gz | tar xz ./frankenphp version
自行编译的诱惑在于“可控”,但 FrankenPHP 的静态链接边界非常窄——差一个 configure flag 或一个 pkg-config 路径,就可能产出看似能启动、实则在处理 HTTPS 或上传大文件时崩溃的二进制。Nix 的声明式约束才是它能稳定的真正原因。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











