FrankenPHP升级二进制时外部配置不保留,因所有配置(Caddyfile、.env、php.ini、框架缓存)均在构建阶段固化进单文件,运行时不再读取;仅Caddyfile路径不变可重加载、环境变量需重启前显式设置、public静态资源和getenv()读取的敏感配置可延续。

FrankenPHP 升级二进制时,外部配置根本不会被保留
FrankenPHP 的独立二进制是「静态嵌入」设计:PHP 运行时、Caddy 配置、应用代码、php.ini 全部编译进单个文件。你手头的 Caddyfile、.env、config/*.php 等外部文件,在构建阶段就被读取、解析、固化——运行时完全不访问它们。所以升级二进制 ≠ 更新配置,而是彻底替换整个执行环境。
哪些“配置”实际能被新二进制沿用
只有运行时可变、且未被编译期硬编码的部分才可能延续:
-
Caddyfile:只要放在新二进制启动目录下,且路径没变(如仍为项目根目录),它就会被自动加载 —— 但注意:FrankenPHP 启动时会重新解析它,不是“复用旧内存状态” - 环境变量(如
APP_ENV=prod):必须在新二进制启动前通过 shell 或 systemd 设置好;Docker 中需通过-e APP_ENV=prod显式传入 - public/ 下的静态资源(如
robots.txt、favicon.ico):只要路径不变、权限可读,新二进制会照常提供 - 数据库连接信息等敏感配置:若你用
getenv("DB_HOST")读取,且环境变量已正确注入,则不受二进制更新影响
哪些“配置”升级后必然丢失或失效
以下内容在构建阶段就固化进二进制,换二进制即重置:
-
php.ini参数:如memory_limit、opcache.enable—— 官方二进制内置固定值,无法通过外部文件覆盖;改它必须重编译 - 框架缓存(
var/cache/prod/或bootstrap/cache/):构建时已把编译后的 PHP 数组写死进二进制,运行时不再生成或读取该目录 -
.env文件内容:仅在构建时被读取一次,转为常量注入;运行时$_ENV和getenv()返回的是构建时刻的快照 - 第三方 PHP 扩展(如
ext-redis):官方二进制只含预编译的扩展列表;新增扩展必须自己重编译 FrankenPHP
安全升级的实操要点
别指望“平滑过渡”,重点是确保新二进制启动前,所有依赖项已就位:
立即学习“PHP免费学习笔记(深入)”;
- 确认
Caddyfile已存在且语法无误(可用caddy validate --config Caddyfile提前检查) - 检查
public/index.php是否可读、是否为当前框架版本的入口(Laravel 11 要求index.php包含新 bootstrap 逻辑) - 验证环境变量:在启动新二进制前,先运行
env | grep -E "(APP_|DB_|REDIS_)"确保关键变量已导出 - 若用 systemd,更新
ExecStart=指向新二进制路径,并执行sudo systemctl daemon-reload && sudo systemctl restart frankenphp - Docker 用户务必重建镜像或更新
docker run命令中的二进制路径,挂载卷(-v $PWD:/app)不能省
APP_URL=http://localhost,但生产部署时忘了设 APP_URL=https://myapp.com,那么新二进制里所有生成的 URL 都会错,而且无法热修复。



















