frankenphp reload仅热更新caddyfile配置,不重启worker进程;必须启用watch: true才能监听.php/.yaml等文件变更并自动sigterm旧worker、拉起新实例。

必须用 watch: true,别指望 frankenphp reload 或文件系统 inotify 自动触发
为什么 frankenphp reload 不会重启 Worker
执行 frankenphp reload 实际只做一件事:让 Caddy 重新加载 Caddyfile,路由、TLS、反向代理规则这些会热更新,但 PHP worker 进程完全不受影响。它仍拿着旧的 Symfony 容器、旧的 OPcache 字节码、旧的 config/packages/*.yaml —— 改了控制器?没用。改了服务定义?照样不生效。
-
reload是 Caddy 层命令,不是 FrankenPHP 的 worker 管理命令 - worker 进程生命周期由 Caddy 主进程托管,Caddy 不会因配置重载而主动 kill 它们
- 除非你手动
kill -TERM $PID或用frankenphp stop-workers,否则 worker 会一直跑下去
watch: true 是唯一开箱即用的监听方案
FrankenPHP ≥ 1.2 才支持该功能,它内建基于 fsnotify 的文件监听器,只对项目根目录下特定后缀变更敏感:
- 监听路径是
frankenphp.yaml所在目录(即项目根),不是public/或src/ - 默认监控
.php、.yaml、.yml、.env、.ini文件,不监控vendor/ - 一旦命中变更,向当前活跃 worker 发送
SIGTERM,worker 会完成当前请求后退出,Caddy 自动拉起新实例 - 需确保
frankenphp.yaml中已启用:watch: true,且FRANKENPHP_WORKER=1已设为环境变量
常见监听失效原因和绕过方式
监听看似简单,但几个细节错一点就静默失败:
- 路径写错:
watch只认frankenphp.yaml当前所在目录,若你把它放在/etc/frankenphp/而项目在/var/www/app,监听完全不会启动 - 权限问题:运行 FrankenPHP 的用户(如
www-data)必须对项目目录有读+执行权限,否则 fsnotify 初始化失败,日志里只有failed to start watcher一行 - vendor 更新无效:改了 Composer 包?
watch不管,得手动opcache_reset()或重启整个 FrankenPHP 进程 - IDE 临时文件干扰:某些编辑器(如 VS Code)保存时先写
.php.swp再重命名,watch会误触发;可在frankenphp.yaml加ignore: [".*"]过滤
真正可靠的开发流是:watch: true + max_requests: 500(防内存累积)+ opcache.enable_cli: 1(加速类加载)。别试图用 inotifywait 封装脚本去调 stop-workers,FrankenPHP 已经把这事做完了,多一层反而容易漏信号或重复触发。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











