frankenphp不支持慢接口专属线程池,其线程池全局共享;唯一可靠隔离方案是拆出独立worker实例并反向代理,实现进程级隔离与资源独立。

FrankenPHP 没有“慢接口专属线程池”这个概念
FrankenPHP 的线程池是全局共享的,num_threads 和 max_threads 控制的是所有 PHP 请求共用的一组线程。它不支持按路由、路径或接口名划分独立线程池——这不是设计缺失,而是架构取舍:Go 层负责调度和隔离,PHP 层只管执行。
真正能隔离慢接口的只有 Worker 模式 + 反向代理
如果你有一个 /api/report 接口常耗时 10s(比如导出大 Excel),又不想让它堵住 /api/user 这类毫秒级接口,唯一可靠的做法是把它拆出去,用独立的 FrankenPHP worker 实例承载:
- 启动一个专用 worker:
frankenphp-worker --script /var/www/report.php --addr :8081 - 在主 Caddyfile 中用
reverse_proxy把 /api/report 路由过去:route /api/report/* { reverse_proxy http://127.0.0.1:8081 } - 主服务继续用
php指令处理其他请求,不受 report.php 阻塞影响
注意:两个实例之间完全进程隔离,report.php 崩溃不会影响主站,内存、OPcache、数据库连接也互不干扰。
为什么不能靠 max_wait_time 或队列优先级“软隔离”
max_wait_time(如 max_wait_time 10s)只控制请求在队列里等线程的最长时间,超时就直接 503;它不改变调度顺序,也不提升慢请求的优先级。实际压测中你会发现:
- 当慢接口持续占用线程,
frankenphp_queue_depth会持续上涨,新请求排队 - 即使你把
max_wait_time设为 1s,也只是让快接口更快失败,而非更快执行 - FrankenPHP 当前没有类似 Nginx 的
upstream fair或权重调度机制
容易被忽略的关键点
拆出 worker 后,别忘了三件事:
- 数据库连接必须显式配置持久化(
PDO::ATTR_PERSISTENT => true),否则每个 worker 实例都会新建连接池,可能瞬间打爆max_connections -
report.php里不能依赖$_SERVER['REQUEST_URI']等 CGI 变量——Worker 模式下这些由 FrankenPHP 构造,不是从 HTTP 请求解析来的 - 如果 report.php 用到 Laravel/ Symfony 的容器,需手动触发
Kernel::boot(),它不会自动加载框架生命周期
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











