静态构建frankenphp必须使用dunglas/frankenphp:static-builder-musl镜像(基于alpine/musl),在glibc系统上直接编译会产生动态链接,无法实现零依赖;构建产物为单文件、真正静态,需通过file和ldd验证,且仅支持linux x86_64/aarch64平台。

静态构建需要 musl libc 环境,不能用 glibc 主机直接编译
FrankenPHP 官方提供的 static-builder-musl 镜像基于 Alpine Linux(musl libc),这是生成真正静态二进制的前提。如果你在 Ubuntu/CentOS/macOS 这类 glibc 系统上直接运行 frankenphp build 或尝试用系统 PHP 编译,最终产物仍会动态链接到 libc.so.6,无法做到“零依赖运行”。
- 必须使用
dunglas/frankenphp:static-builder-musl镜像作为构建环境(Docker 是唯一可靠方式) - 宿主机只需能运行 Docker,无需安装 PHP、Composer 或任何扩展
- 构建过程不依赖宿主机的
php.ini或全局配置,所有 PHP 行为由构建镜像内预设决定
构建时 extension 安装要显式声明,不能靠 php.ini 启用
musl 构建环境下,docker-php-ext-install 是唯一安全的扩展启用方式。像 opcache、pdo_mysql 这类常用扩展,必须在构建阶段 RUN 指令中明确安装,否则二进制里不会包含——哪怕你后续挂载了自定义 php.ini,也起不了作用。
-
opcache强烈建议安装,它直接影响常驻模式下的性能稳定性 -
pdo_sqlite和pdo_mysql二选一即可,不要同时装,避免符号冲突 -
mbstring、curl、json属于 FrankenPHP 默认内置,无需重复安装
构建输出体积大是正常现象,但运行时内存占用并不高
一个典型的 Laravel + SQLite 静态二进制大小在 40–60 MB,这是因为整个 PHP 运行时、Caddy、libphp、所有启用的扩展都被打包进去了。但这只是磁盘占用,启动后 Resident Set Size(RSS)通常只有 15–25 MB,远低于传统 Nginx+PHP-FPM 组合的常驻内存开销。
- 别被文件体积吓住,它不等于运行时内存压力
- 构建产物是单文件,可直接复制到任意 Linux x86_64/aarch64 主机运行,连
ldd都显示not a dynamic executable - 如果构建后
file ./frankenphp显示 “dynamically linked”,说明构建环境没用对镜像,得重来
macOS 和 Windows 不能直接构建,但可以本地验证构建结果
FrankenPHP 的静态构建只支持 Linux amd64/arm64 平台。macOS(即使 Apple Silicon)和 Windows 上无法生成有效二进制,因为 musl 工具链不可用。不过你可以用 Docker Desktop 在 macOS/Windows 上拉取 static-builder-musl 镜像完成构建,再把产出的二进制拷出来部署。
- 构建命令本身不挑宿主机,只要 Docker Engine 可用就行
- 构建产物必须在目标部署平台(如 ARM 服务器)上测试,x86_64 构建的二进制无法在 aarch64 上运行
- 验证是否真静态:在目标机器执行
./frankenphp version,不报command not found或No such file or directory就算成功
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











