frankenphp不支持线程自动扩展与空闲回收,其并发模型基于swoole协程而非os线程;每个worker进程内运行单个eventloop,请求由协程并发处理,协程生命周期由swoole自动管理,退出即释放栈内存,无需手动回收。

FrankenPHP 不支持自动扩展线程,也不存在“空闲线程回收”这一机制。 它底层基于 Swoole 协程调度器(非 pthreads / 多线程模型),所有 PHP 逻辑运行在协程中,而非 OS 线程。所谓“自动扩展”,实际是协程数量动态增减,不是线程创建/销毁。
FrankenPHP 的并发模型不是多线程
FrankenPHP 启动时只创建固定数量的 Worker 进程(默认 1 个,可通过 FRANKENPHP_WORKERS 配置),每个 Worker 内部运行一个 Swoole EventLoop,所有请求由协程(coroutine)并发处理。这些协程共享同一 OS 线程,不涉及 pthread_create 或线程池管理。
因此:
- 没有「核心线程」「非核心线程」概念
- 不受 allowCoreThreadTimeOut、keepAliveTime 影响
- 不存在需要手动调用 shutdown() 回收的线程对象
协程生命周期由 Swoole 自动管理
协程的创建和销毁完全由 Swoole 控制:任务开始时自动 spawn,执行结束(包括正常 return、异常退出、超时中断)后其栈内存立即释放,无需干预。
- 协程栈默认 8KB,按需扩容,退出即归还至内存池
- 没有长期驻留的“空闲协程”——没任务时 EventLoop 空转,不占用额外协程资源
- 若你观察到内存缓慢增长,大概率是 PHP 层代码持有全局引用(如 static 变量、未关闭的
PDO连接、未unset()的大数组),而非协程未回收
如果你看到“线程数上升”,那可能是误读指标
某些监控工具(如 top、htop)把 FrankenPHP 的 Worker 进程及其内部的轻量级协程线程(如 php-fpm: pool www 类似显示)混称为“线程”,造成误解。真实情况是:
-
ps -eLf | grep frankenphp显示的 LWP(轻量级进程)数量 ≈ 当前活跃协程数 + 1(主线程),但这只是内核视角的调度单元映射,不是用户可配置或需回收的对象 - FrankenPHP 不暴露
ThreadPoolExecutor风格的 API,也没有getActiveCount()或purge()方法 - 唯一可控的“缩容”动作是减少
FRANKENPHP_WORKERS并重启进程,但这属于进程级伸缩,非运行时线程回收
真正要关注的是协程内资源清理:确保数据库连接在 finally 块中 close(),ThreadLocal 类逻辑(如自定义上下文)在协程退出前 unset() 或显式 remove(),否则残留引用会阻止 GC —— 这才是 FrankenPHP 场景下最常被忽略的“回收点”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











