FrankenPHP 1.2 的 Worker 模式与 HTTPS 独立配置:Worker 需用 php_worker 指令指定绝对路径入口脚本,HTTPS 则由 Caddy 自动完成证书申请与续期,二者可协同但不可混淆;默认为 per-request 模式,必须显式启用才能运行常驻 Worker。

FrankenPHP 1.2 的 Worker 模式和 HTTPS 是两个独立但需协同配置的功能:Worker 模式靠入口脚本与启动方式控制,HTTPS 则完全由 Caddy 驱动。两者可以同时启用,但不能混为一谈——开 HTTPS 不等于开了 Worker,反之亦然。
Worker 模式必须显式启用
FrankenPHP 1.2 默认仍是 per-request 模式。要启用常驻 Worker,你得在 Caddyfile 中明确使用 php_worker 指令(不是 php_server),并指向正确的 worker 入口:
- 路径必须是绝对路径,例如:
php_worker /var/www/app/public/worker.php - 不能写成
./public/worker.php或public/worker.php,Caddy 启动时工作目录不可控 - Symfony 项目请直接用官方
public/worker.php(6.3+ 内置);Laravel 或自建框架需手动编写,确保只初始化 Kernel 一次,并用frankenphp_handle_request()包裹请求逻辑 - 别用
frankenphp-worker --script ...单独启进程——这会脱离 Caddy 管理,发布时无法优雅停止
HTTPS 由 Caddy 自动完成,无需额外插件
只要满足基本前提,FrankenPHP 1.2 内置的 Caddy 会自动申请、部署并续期 Let’s Encrypt 证书:
- Caddyfile 中监听块必须是有效域名,如
example.com { ... },不能是:80或localhost - 宿主机必须开放 TCP 80 和 443 端口(云服务器要配安全组,本地要关防火墙)
- Docker 运行时必须映射端口:
-p 80:80 -p 443:443;若需 HTTP/3,再加-p 443:443/udp - 不要手动写
tls或automatic_https off—— 这会干扰自动流程
Worker + HTTPS 同时生效的关键验证点
两者都配好后,需确认三件事才算真正跑通:
立即学习“PHP免费学习笔记(深入)”;
- 日志中出现
Starting PHP worker pool with X workers,说明 Worker 已拉起 - 访问
https://your-domain.com能正常打开,地址栏有锁图标,且响应头含alt-svc: h3=(HTTP/3 已启用) - 在控制器里打印
getmypid(),连续刷新两次,PID 相同 → 表明复用的是同一个常驻 PHP 进程,不是每次新建
常见失败组合及修正
以下搭配极易出问题,务必避开:
- 用
php_server指令却想跑 Worker → 改成php_worker - HTTPS 域名 DNS 未解析或 80 端口被 CDN 拦截 → 导致 ACME 验证失败,Caddy 日志报
acme: error: connection - worker.php 里漏了
frankenphp_handle_request()或没做清理(如没调gc_collect_cycles())→ 请求卡死、内存持续上涨 - 环境变量如
APP_ENV没通过 Caddyfile 的env子句传入,或依赖 .env 文件 → 常驻进程中只读一次,后续请求失效



















