think-swoole 4.0和3.0版本区别

think-swoole 4.0 和 3.0 版本之间存在非常底层的架构调整与设计升级。3.0 版本主要运行在传统的异步非阻塞风格(或半协程)下,而 4.0 版本则是彻底的全协程风格(Coroutine)重构版本。 [1, 2]

以下是 3.0 和 4.0 版本在底层架构、配置和功能上的核心区别:

1. 底层服务端架构的改变(最核心区别)

  • 3.0 版本:底层使用的是 Swoole 的传统异步/进程模式(如 Swoole\Http\Server)。在这个模式下,框架依然依赖 Swoole 传统的回调事件(如 onRequest)来驱动业务,协程属于可选的辅助功能。 [1]

  • 4.0 版本:全面倒向协程风格服务端(如 Swoole\Coroutine\Http\Server)。服务从启动开始就完全运行在协程容器中,去除了很多 3.0 的传统事件回调,最大化榨取高并发性能。 [1, 2]

2. 依赖注入与 Swoole\Server 对象的消失

  • 3.0 版本:在控制器或服务中,你可以通过依赖注入轻松获取 Swoole\Server 对象,用来获取连接信息、推送异步任务。

  • 4.0 版本:由于底层换成了纯协程服务端,Swoole\Server 对象不复存在,因此无法再进行依赖注入。如果你的 3.0 代码中大量使用了 app(\Swoole\Server::class),直接升级到 4.0 会直接引发报错。 [1]

3. 静态文件访问支持

  • 3.0 版本:内置了基本的静态文件处理逻辑(借助 Swoole 的 document_root 参数),可以直接访问 public 目录下的静态文件。

  • 4.0 版本默认不再支持任何静态文件访问。官方强制建议将静态资源交由前面的 Nginx 处理(即 Nginx + Swoole 动静分离),只将动态请求转发给 Swoole。 [1]

4. 运行环境与 PHP 版本的硬性门槛 [1]

  • 3.0 版本:主要适配 ThinkPHP 6.0 早期版本,支持 PHP 7.1 ~ PHP 7.4。

  • 4.0 版本:在 v4.0.10 及之后的最新版本中,强制要求 PHP 8.0+ 运行环境,并且完美适配了最新的 ThinkPHP 8.0 框架。 [1, 2, 3, 4]

5. WebSocket 的监听与事件处理机制

  • 3.0 版本:WebSocket 事件在 config/swoole.php 中有非常松散和具象的 listen 配置项,允许为不同的事件(如 connect, message)配置独立的 Listener 类。 [, 2]

  • 4.0 版本:统一收拢了统一的事件监听行为(如统一走 WebsocketEvent::class),通过一个主入口在 handler 函数内部根据 $type(方法名)或数据进行二次分发,这让事件的底层通信和内存开销更小、运行效率更高。 [, 2]


对比总结表

特性 / 维度 [1, 2, 3, 4, 5]

think-swoole 3.0

think-swoole 4.0

底层风格

传统异步事件回调模式 (Swoole\Http\Server)

纯协程风格服务端 (Coroutine\Http\Server)

PHP 环境要求

PHP 7.x (最低支持 PHP 7.1)

PHP 8.0+ (自 4.0.10 起强制要求)

适配 TP 版本

ThinkPHP 6.0

ThinkPHP 6.1 / 8.0

静态文件支持

内置支持 document_root

默认不支持,必须依赖 Nginx 反代

Swoole\Server 注入

支持直接注入获取

不支持(对象已在底层被移除)

升级建议

如果你打算将现有的 3.0 项目升级到 4.0,重点需要检查业务代码中是否包含 \Swoole\Server 的注入或直接调用;如果项目中使用了内置的 think-swoole 承载前端图片或 JS/CSS,升级后必须改用 Nginx 配置反向代理代理静态资源。 [1, 2]