frankenphp 不支持编译时指定内置 php 版本,其 php 运行时硬绑定于官方维护的 php-src fork 分支,当前主线稳定支持 php 8.2 和 8.3,版本由构建时源码分支和 builder 镜像决定,无法通过 configure 参数或环境变量动态切换。

FrankenPHP 编译时不能指定内置 PHP 版本
FrankenPHP 的源码编译不支持通过 --with-php-version 或类似参数自由选择内置 PHP 版本。它的 PHP 运行时是**硬绑定在构建时确定的特定 PHP 源码分支上**,由 FrankenPHP 官方维护的 php-src fork 控制,不是你本地系统已装的 PHP。
常见误解是把它当成 PHP-FPM 那样可插拔运行时——实际它把修改过的 PHP 解析器直接编译进 Go 二进制,php -v 输出的版本号来自该 fork,而非系统 PHP。
想用特定 PHP 版本?得看 FrankenPHP 官方是否已适配
目前(2026年10月),FrankenPHP 主线稳定支持的 PHP 版本为 8.2 和 8.3,对应发布分支是:
-
main分支 → 绑定php-8.3衍生版(默认) -
php-8.2分支 → 绑定php-8.2衍生版(需显式检出)
你无法在 main 分支里“切”出 PHP 8.1 或 8.4 —— 因为对应 PHP 源码尚未被 FrankenPHP 团队 patch 并合并。
验证方式很简单:克隆后看 .github/workflows/build.yml 或 go.mod 里引用的 github.com/php/frankenphp/php-src 提交哈希,再查该哈希对应的 PHP 分支标签。
自定义 PHP 补丁必须改 FrankenPHP 的 php-src fork
如果你真有强需求(比如要加一个未合入上游的 mbstring 补丁),流程是:
- fork
github.com/php/frankenphp/php-src - 在对应 PHP 版本分支(如
php-8.3)上提交你的修改 - 修改 FrankenPHP 主仓库的
go.mod,把github.com/php/frankenphp/php-src指向你的 fork + 分支 - 运行
make build,Go 构建过程会拉取并编译你定制的 PHP 源码
注意:configure 参数(如 --enable-mbstring)仍有效,但仅限于 FrankenPHP 所打包的 PHP 源码本身支持的选项;像 --with-libmbfl 这类路径参数,在静态嵌入模式下基本无效,因为依赖已预编译进 php-src 子模块。
docker build-static.sh 里也没有 PHP 版本开关
很多人想靠 EMBED=... + 环境变量控制 PHP 版本,但查看 build-static.sh 源码可知:它只决定打包哪些 PHP 扩展(PHP_EXTENSIONS=ctype,iconv,pdo_sqlite),不碰 PHP 解释器核心版本。
真正起作用的是构建镜像的基础层 —— dunglas/frankenphp:static-builder 镜像本身已固定了 PHP 版本。你只能选官方发布的 builder 镜像 tag,例如:
dunglas/frankenphp:static-builder-8.2dunglas/frankenphp:static-builder-8.3
试图在 Dockerfile 里 RUN apt install php8.1-dev 是徒劳的:FrankenPHP 不链接系统 PHP,它连 libphp.so 都不加载。
最易被忽略的一点:FrankenPHP 的「PHP 版本」本质是 Go 构建时的一个编译期常量,不是运行时可配置项。想换版本,就得换源码分支、换 builder 镜像、重跑整个构建链 —— 没有快捷方式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











