keep_alive 是 swoole server 的 tcp 层保活开关,控制内核级 tcp keepalive 探测,与 http 协议无关;它在连接空闲超时后发送探测包以检测链路存活,不影响 http 连接复用逻辑。

keep_alive 是 Swoole Server 的 TCP 层保活开关
keep_alive 是 Swoole Server 配置项,控制的是底层 TCP 连接的系统级保活探测(即 TCP keepalive),和 HTTP 协议无关。它只在连接空闲时起作用:当一个 TCP 连接建立后,没有任何数据收发,持续超过 tcp_keepidle 时间(Linux 默认 7200 秒),内核会开始发送探测包;若连续 tcp_keepintvl 间隔发包、共 tcp_keepcnt 次都无响应,则关闭该连接。
这个机制解决的是“连接是否还活着”的问题,不是“能不能复用”。即使你关掉 keep_alive,只要客户端和服务端都未主动断连,TCP 连接仍可存在——只是没人探测,可能变成僵尸连接。
- 默认值为
true(开启),但实际生效依赖操作系统内核参数 - 它不感知 HTTP 请求/响应边界,也不参与 Connection 头协商
- 对 WebSocket 或自定义 TCP 协议服务有意义,对纯 HTTP 服务影响有限
HTTP 长连接靠 Connection: keep-alive 头协商
Swoole 的 HttpServer 在处理 HTTP 请求时,是否复用 TCP 连接,取决于 HTTP 协议层面的 Connection 头。HTTP/1.1 默认就是 Connection: keep-alive,客户端发请求带这个头,Swoole 回复时也会带上 Connection: keep-alive 和 Keep-Alive: timeout=15, max=100 这类字段。
这里的 timeout 是 Swoole 自己维护的连接空闲超时(单位秒),和 TCP 层的 tcp_keepidle 完全无关;max 表示该连接最多承载多少次 HTTP 请求后强制关闭。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 你可以在
onRequest中通过$request->header['connection']检查客户端是否要求长连接 - 如果客户端发来
Connection: close,Swoole 会在响应后立即close()这个 socket - 即使
keep_alive => true,若 HTTP 响应头里没加Connection: keep-alive,连接也不会被复用
两者共存但职责分离,容易混淆的点
同一个 TCP 连接上,可能同时存在两套“保活”逻辑:一个是内核级的 TCP keepalive(由 keep_alive 配置触发),另一个是应用层的 HTTP keep-alive(由 Connection 头 + Swoole 内部计时器控制)。它们互不干扰,但目标不同:
- TCP keepalive 探测物理链路是否断裂,防止 fd 泄漏
- HTTP keep-alive 控制“这个连接还能不能接下一个 HTTP 请求”,属于协议行为
- 如果 HTTP 层已因
timeout关闭连接,TCP keepalive 就不会再触发——socket 已销毁 - 反过来,TCP keepalive 触发并断连,HTTP 层不会知道,只会收到
ECONNRESET或读取到 0 字节
实际调优建议:先理清你要解决什么问题
如果你遇到大量 TIME_WAIT 或连接堆积,优先检查 HTTP 层的 keep_alive 超时是否过长;如果发现服务器上有大量 ESTABLISHED 状态但无数据的连接,且长时间不释放,才需要排查 TCP 层的 keep_alive 参数或系统内核设置。
- HTTP 场景下,通常把
keep_alive_timeout设为 15~30 秒足够,太长反而增加服务端压力 - 不要指望关掉
keep_alive => false来禁用 HTTP 长连接——它只关 TCP 探测,不影响 HTTP 复用逻辑 - WebSocket 连接必须依赖 TCP 层保活,此时
keep_alive => true是刚需,而 HTTP 的Connection头完全不参与
最常被忽略的是:Swoole 的 keep_alive 配置只对 Server 生效,HttpClient 客户端要用 set 方法单独配置 keep_alive,否则发起的请求默认不复用连接。










