frankenphp 的 php_worker 不支持路径路由,因其 worker 模式与 http 路由属不同抽象层:一个 worker 块仅绑定一个常驻进程和单个入口脚本,无法在进程内按 uri 路径分发到隔离子逻辑;需通过多个独立实例 + caddy 反向代理实现路径分流。

FrankenPHP 不能“让指定路径交给特定 Worker 处理”——worker 模式和 HTTP 路由是两个独立层级,php_worker 指令不支持按路径分发到不同后台进程。
为什么 php_worker 不支持路径路由
FrankenPHP 的 php_worker(或 Caddyfile 中的 worker 块)只声明一个常驻 PHP 进程用于处理“所有匹配该路由块的 HTTP 请求”,但它本身不是多路复用器。它不会解析 PATH_INFO 或检查 $_SERVER['REQUEST_URI'] 来决定调用哪个子逻辑;它只运行你指定的单个脚本(如 public/worker.php),并在每次请求到来时触发 frankenphp_handle_request() 回调。
换句话说:一个 worker 块 = 一个 PHP 进程 = 一个入口脚本。你无法在一个 worker 实例里“切出多个路径分支”并让它们跑在隔离的子进程中。
想实现 /api/queue 走队列 worker、/api/notify 走通知 worker?得启动两个实例
真正可行的做法是启动两个完全独立的 FrankenPHP worker 实例,各自绑定不同端口,并用 Caddy 反向代理按路径分流:
- 实例 A:
frankenphp php-server --worker /var/www/app1/worker.php --addr :8081 - 实例 B:
frankenphp php-server --worker /var/www/app2/worker.php --addr :8082 - Caddyfile 中写:
handle /api/queue/* { reverse_proxy http://127.0.0.1:8081 } handle /api/notify/* { reverse_proxy http://127.0.0.1:8082 }
注意:--script(旧版)或 --worker(1.1+)参数必须是绝对路径;相对路径会报 failed to open stream: No such file or directory;两个实例绝不能共用同一端口。
别在 worker.php 里 if-else 路由,那会破坏模型
有人试图在一个 worker.php 文件里写:
if (str_starts_with($_SERVER['REQUEST_URI'], '/api/queue')) {
include 'queue_handler.php';
} elseif (str_starts_with($_SERVER['REQUEST_URI'], '/api/notify')) {
include 'notify_handler.php';
}
这看似能工作,但实际埋下隐患:
- 所有逻辑共享同一个进程内存空间,
queue_handler.php和notify_handler.php的全局变量、静态属性、连接池会互相污染 - 无法单独重启某一路由逻辑;一个 handler 内存泄漏,整个 worker 挂掉
- 无法对不同路径设置不同超时、并发数或资源限制
- 日志混在一起,排查困难;扩容时也无法只扩 queue 而不扩 notify
Caddy 的 php_server 和 php_worker 是互斥的吗
不是互斥,但用途完全不同:
-
php_server:用于传统请求响应模型,每个请求都完整走一遍框架生命周期(适合 Laravel/Symfony 的普通 Web 请求) -
php_worker:用于长连接、事件驱动、队列监听等场景,它启动后就常驻,靠frankenphp_handle_request()接收 HTTP 请求(适合需要复用 DB 连接、避免重复引导的高频轻量接口)
你可以同时存在:php_server 处理 HTML 页面,php_worker 处理 API;但不能用 php_worker 去“代理”另一个 worker —— 它没有内置反向代理能力。
最易被忽略的一点:worker 脚本里没写 frankenphp_handle_request(),或者写了但没调用 $response->send() 和 $app->http->end(),会导致请求卡住、Caddy 超时、连接堆积。这不是配置问题,是脚本逻辑缺失。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











