frankenphp 1.3 worker 模式无平滑重启命令,唯一可控的“不中断请求”方式是执行frankenphp stop-workers,使活跃 worker 完成当前请求后退出,由 caddy 自动拉起新实例加载新代码;需确保 current 软链已切换、权限正确、路径为绝对路径且 frankenphp_worker=1 已启用。

FrankenPHP 1.3 的 Worker 模式没有传统意义的“平滑重启”命令,它不监听 SIGUSR1、SIGHUP 或 reload 信号来触发进程轮换。所谓“平滑”,是指不中断正在处理的请求,而实现这一点的唯一可控方式,是让当前 Worker 主动完成手头任务后退出,再由 Caddy 自动拉起新实例加载新代码。
关键不在“重启”,而在“优雅退出 + 自动替换”。
✅ 正确操作流程(发布级无感更新)
-
确保前置准备全部就绪
-
current软链接已指向新 release 目录(如/var/www/app/releases/20261015-180000) - 新目录下
public/index.php可读,var/cache和var/log可写 - 已执行
composer install --no-dev --optimize-autoloader - Caddyfile 中
php_worker指令路径为绝对路径,且与current下实际位置一致
-
-
执行官方支持的退出指令
frankenphp stop-workers
- 该命令向所有活跃 Worker 进程发送终止信号
- Worker 会等待当前请求完全返回后再退出(包括协程、异步 cURL、流读取等未阻塞完成的操作)
- Caddy 立即启动新 Worker 实例,加载新
public/index.php和当前环境
-
确认新 Worker 已生效
- 查看 Caddy 日志,应有类似
Started new PHP worker的提示 - 检查
ps aux | grep 'frankenphp.*worker',旧进程消失,新进程 PID 更新 - 访问应用,验证新逻辑(如新路由、新配置)是否生效
- 查看 Caddy 日志,应有类似
⚙️ 配合自动滚动(防内存泄漏/状态累积)
在 Caddyfile 的 php_worker 块中显式设置 max_requests:
php_worker /var/www/app/current/public/index.php {
env APP_ENV=prod
max_requests 5000
}
- Worker 处理满 5000 个请求后会主动退出,Caddy 自动补新实例
- 这是无需人工干预的被动优雅更新机制,推荐设为 1000–5000 之间
❌ 常见错误操作(会导致中断或无效)
- 用
kill -TERM $PID杀 Worker 进程 → 强制中断当前请求 - 执行
caddy reload→ 只重载 Caddy 配置,不更新 PHP 代码或重启 Worker - 在入口脚本里漏写
while (true) { frankenphp_handle_request(); }→ 脚本执行完即退出,Caddy 不断补新进程(看似“重启”,实为配置/逻辑错误) - 未设
FRANKENPHP_WORKER=1环境变量 → Worker 模式根本未激活,stop-workers会报 “no worker found”
? 补充:如何验证是否真在 Worker 模式运行?
启动时终端第一行日志必须是:
Starting FrankenPHP Worker Server
如果看到的是 Starting FrankenPHP Server(无 Worker 字样),说明仍处于经典模式,需检查环境变量、Caddyfile 配置及 php_worker 指令是否存在。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











