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