swooleserver 是纯 tcp 服务器,不解析 http 协议,所有数据原样交由 on('receive') 处理;swoolehttpserver 则自动解析 http 报文并封装 request/response 对象,支持标准 http 特性。

Server 是纯 TCP 服务器,不解析 HTTP 协议
你用 SwooleServer 启动的服务,底层只收发原始字节流,不做任何协议解析。它不知道什么是 GET /api/user,也不知道 Content-Type 是什么——所有请求数据都原样扔进 on('receive') 回调,由你手动拆包、解码、路由。
常见错误现象:
- 直接把浏览器访问
http://127.0.0.1:9501当作正常请求,结果看到一堆乱码或空响应(因为没处理 HTTP 头) - 误以为
$server->send($fd, "OK")能返回标准 HTTP 响应,实际浏览器卡在 loading 状态(缺少状态行和空行)
适用场景:
- 自定义私有协议(如 IoT 设备心跳包、游戏客户端指令)
- 需要极致控制连接生命周期(比如长连接保活、FD 级别限流)
- 与非 HTTP 客户端直连(如 Python socket、C++ 客户端)
HttpServer 自动解析 HTTP 报文,封装 request/response 对象
SwooleHttpServer 是 SwooleServer 的子类,但内置了完整的 HTTP 解析器。它会把原始 TCP 数据流按 RFC 7230 拆成 $request(含 $request->get、$request->cookie、$request->header)和 $response(支持 $response->status()、$response->cookie()、$response->end())。
关键差异点:
-
on('request')只在完整 HTTP 请求到达后触发;on('receive')在每个 TCP 包到达时就触发 -
$response->end()会自动补全 HTTP 状态行、头尾空行、Content-Length;手写 TCP 服务器必须自己拼 - 默认支持 Keep-Alive、chunked transfer encoding、HTTP/1.1 pipeline(无需额外配置)
性能影响:HTTP 解析有微量开销(微秒级),但换来的是开发效率和协议兼容性。除非你压测发现瓶颈真在 parser 层,否则别退回到裸 Server。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
别混用 on('receive') 和 on('request') 事件
一个 SwooleHttpServer 实例里,同时注册 on('receive') 和 on('request') 是合法的,但行为不可控:
- HTTP 请求仍会先进入
on('receive'),然后才进on('request')—— 你可能在receive里提前 close 了连接,导致后续 request 事件丢失 - 非 HTTP 流量(比如 telnet 连上去敲字符)会走
receive,但不会触发request,容易造成逻辑分支混乱 - 某些 Swoole 版本(如 4.8.x)在启用
http_compression时,receive收到的数据是压缩后的二进制,而request里已经是解压后的明文
建议:明确服务类型。如果是 HTTP API,只用 on('request');如果要混接 HTTP + 自定义协议,改用 SwooleServer + 手动协议识别,别依赖 HttpServer 的混合模式。
命名空间和版本兼容性陷阱
旧代码里常见的 swoole_http_server(无命名空间,下划线命名)仅存在于 Swoole 2.x,已在 4.0+ 彻底废弃。现在 SwooleHttpServer 是唯一正统写法。
容易踩的坑:
- 升级 Swoole 到 4.8 后,
new swoole_http_server()直接报Class 'swoole_http_server' not found - 在
SwooleHttpServer实例上调用$server->set(['worker_num' => 4])没问题,但若误写成$server->setWorkerNum(4)(驼峰法),会静默失败(该方法只存在于老版swoole_http_server) - PHP 8.1+ 下,
SwooleServer和SwooleHttpServer都要求显式声明declare(strict_types=1),否则部分回调参数类型校验会出错
复杂点在于:HTTP Server 的 request 对象不是简单数组,它是 C 结构体封装的 PHP 对象,var_dump($request->get) 看起来像数组,但不能用 array_merge 或引用赋值——一不小心就会触发内存错误或空指针。










