frankenphp 无法通过 reload 或 kill 优雅重启 worker,唯一官方支持方式是先完成代码切换再执行 frankenphp stop-workers,它通知活跃 worker 完成当前请求后退出,由 caddy 自动拉起新实例加载新代码,全程不中断服务。

FrankenPHP 没有 reload 或 restart 命令能直接优雅重启 Worker——它不监听 SIGHUP,也不支持传统平滑 reload。所谓“手动优雅重启”,本质是通知当前活跃 Worker 主动退出,由 Caddy 自动拉起新实例,且不中断正在处理的请求。
为什么不能用 kill -USR2 或 caddy reload?
FrankenPHP 的 caddy reload 只重载 Caddyfile 配置(路由、TLS、静态路径等),完全不触碰 PHP 运行时或 Worker 进程;kill -USR2 对 FrankenPHP 无效,它不实现该信号语义。强行 kill -TERM 所有 php 进程会中断请求,不是优雅。
必须用 frankenphp stop-workers
这是唯一被 FrankenPHP 官方支持的、可控的 Worker 退出机制。它向所有活跃 Worker 发送终止信号,Worker 会在完成当前请求后干净退出,Caddy 立即启动新 Worker 实例加载新代码。
-
frankenphp stop-workers必须在 FrankenPHP 进程运行时执行,否则报错 “no worker found” - 执行后不会影响 Caddy 主进程,HTTP 服务持续可用
- 新 Worker 启动时自动读取当前
current软链指向的public/index.php,因此务必先完成代码切换再执行该命令 - 若你改了
APP_ENV或环境变量,确保它们已通过env块写入 Caddyfile,否则新 Worker 仍读旧配置
配合 max_requests 实现自动滚动
单个 Worker 不应无限运行,否则内存泄漏或状态累积会恶化。在 Caddyfile 的 php_worker 块中显式设 max_requests:
php_worker /var/www/current/public/index.php {
env APP_ENV=prod
max_requests 5000
}
FrankenPHP 会在 Worker 处理完第 5000 个请求后主动退出,Caddy 自动拉起新实例——这相当于内置的被动优雅重启,无需人工干预。
发布前必须检查的三件事
执行 frankenphp stop-workers 前,漏掉任一环节都会导致新 Worker 启动失败或加载旧代码:
-
current软链接是否已指向新 release 目录(如/var/www/myapp/releases/20261013-110000) - 新目录下
public/index.php是否可读,var/cache是否可写,且已执行composer install --no-dev --optimize-autoloader - Caddyfile 中
php_worker路径是否为绝对路径,并与current下的实际位置一致(不能是./public/index.php)
Worker 模式下,“重启”不是起点,而是终点动作——所有前置准备没到位,stop-workers 就只是让服务不可用的开关。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











