thinkphp 6.0+ 的 swoole 配置统一收口至 config/server.php,需设 'type' => 'swoole' 开启,参数置于 'swoole' 数组内;废弃 tp5.1 的 swooleserver 类与 start_swoole.php;须使用 php think swoole 启动,并注意 think-swoole 扩展与 tp 版本强绑定及协程驱动适配。

ThinkPHP 6.0+ 的 swoole 配置入口变了
TP6 不再通过 config/swoole.php 单独配置,而是统一收口到 config/server.php。如果你照着 TP5 的文档往 config/ 下塞 swoole.php,Swoole 启动时根本不会读它——连 warning 都不报,直接静默忽略。
实操建议:
-
server.php中的'type' => 'swoole'是开关,必须显式设置,否则即使装了扩展也走传统 FPM -
'swoole' => []数组里才放真正 Swoole 相关参数,比如'worker_num'、'task_worker_num' - TP6.3 开始支持
'enable_coroutine' => true,但开启后所有 DB 操作必须用think-swoole提供的协程驱动,原生 PDO 会阻塞
TP5.1 的 SwooleServer 类和 start_swoole.php 已废弃
TP5.1 虽然支持 Swoole,但靠的是自己封装的 think\swoole\SwooleServer 类 + 手动启动脚本 start_swoole.php。这个方案在 TP6 里被完全移除,继续沿用会导致 Class 'think\swoole\SwooleServer' not found。
常见错误现象:
- 升级 TP6 后仍保留
start_swoole.php,运行提示Undefined class constant 'WEB_SERVER' - 试图在
command里调用SwooleServer::start(),结果报错找不到类
实操建议:
- 删掉所有
start_swoole.php和自定义 Swoole 启动逻辑 - 用官方命令
php think swoole启动(需安装topthink/think-swoole扩展) - 若要监听 UDP 或 WebSocket,得在
server.php里改'type'为'swoole_http'或'swoole_websocket',不是加个端口就行
think-swoole 扩展版本和 TP 版本强绑定
不是所有 think-swoole 都能混搭使用。比如 think-swoole:4.0 只支持 TP6.3+,装在 TP6.0 上会触发 Call to undefined method think\App::isDebug() —— 因为 TP6.0 还没这个方法。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
性能与兼容性影响:
-
think-swoole:3.x对应 TP6.0–6.2,支持onRequest回调但不支持自动 reload -
think-swoole:4.1+加了hot_reload配置项,但要求 PHP >= 8.0,且只在开发环境生效 - 生产环境务必关掉
'hot_reload',否则每次请求都扫描文件,CPU 翻倍
数据库连接在 Swoole 常驻进程下容易复用失效
TP 默认的 PDO 连接是“一次请求一断开”,但 Swoole 进程常驻,连接不释放就会卡死或返回旧数据。这不是 TP 的 bug,是 Swoole 的运行模型决定的。
容易踩的坑:
- 用
Db::table()->select()查完不主动 close,第二次查可能拿到第一次的缓存结果 - MySQL 报错
MySQL server has gone away,其实是连接超时被服务端断开了,但 TP 还拿着旧句柄 - Redis 连接同理,
Cache::store('redis')在 Swoole 下必须配'persistent' => false,否则连接池会混乱
实操建议:
- TP6.3+ 推荐用
think-swoole自带的协程 DB 驱动,配置'type' => 'mysql_coroutine' - 如果坚持用原生 PDO,每个请求结束前手动调用
Db::close() - 别信“加个
ping()就能保活”,Swoole 的子进程 fork 后,父进程的 ping 对子进程无效
最麻烦的其实不是配置差异,而是 Swoole 进程生命周期和 TP 请求生命周期不重合——很多问题表面是配置错,根子是没想清楚“谁在什么时候持有了什么资源”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










