连接超时自动优雅熔断需网络层、协议层、应用层三阶协同:一、Nginx前置拦截慢速连接;二、Worker层定时探测并主动关闭空闲连接;三、调用级引入熔断器隔离下游失败;四、进程级兜底防CPU打满。

连接超时自动优雅熔断,不是给单个请求加 timeout,而是让 Worker 在检测到“连接行为异常”时,主动切断它、释放事件循环资源,并避免后续同类连接被重复调度。这需要在网络层、协议层、应用层三阶协同,不能只靠某一层硬设超时。
一、前置拦截:用 Nginx 拦住慢速连接的入口
Nginx 是第一道防线,必须在握手阶段就识别并掐断慢速流。Swoole/Workerman 本身不解析 HTTP 头,等请求进到 onConnect 或 onRequest 时,攻击已生效。
- client_header_timeout 5s:客户端必须在 5 秒内发完全部 HTTP header,否则直接断连(防 Slowloris)
- client_body_timeout 5s:接收 body 时,两次数据到达间隔超 5 秒即关闭(防 Slow POST)
- send_timeout 10s:向客户端写响应时,两次 write 间隔超 10 秒即断开(防 Slow Read)
- keepalive_timeout 5s; reset_timedout_connection on:空闲长连接 5 秒清空,避免 TIME_WAIT 堆积
- WebSocket 场景下,在 location 块中显式设置 proxy_read_timeout 86400 和 proxy_send_timeout 86400,防止误杀合法长连接
二、连接级熔断:Worker 层实时扫描与主动关闭
Swoole/Workerman 可在 onWorkerStart 中启动定时器,定期探测空闲连接状态,对“挂而不动”的连接执行优雅 close。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 每 30 秒调用 $server->connections 获取当前所有连接 ID
- 对每个连接执行 $connection->getSocket()->recv(1, 1)(非阻塞试探),若返回 false 或超时,说明客户端无数据可读
- 若该连接 lastReceiveTime 超过 30 秒未更新,调用 $connection->close() 主动释放
- 配合 max_conn => 1024 和 max_request => 1000 防止单 worker 资源耗尽
三、调用级熔断:对外部服务做带状态的失败隔离
慢速流常伴随下游响应延迟或失败,需防止 Worker 因等待外部服务卡死。此时要引入标准 Circuit Breaker,而非简单 try-catch 计数。
- 将所有外部调用(如 AsyncTcpConnection、curl_init、Redis::connect)统一包装进一个方法,例如 callThirdParty()
- 用 php-resilience/circuit-breaker 的 CircuitBreaker::execute() 包裹该方法
- 配置关键参数:failureThreshold=0.5(错误率 50%)、timeout=60(滑动窗口 60 秒)、minimumThroughput=20(最小请求数,防低流量误判)
- 进入 Open 状态后,捕获 CircuitBreakerOpenException 并返回降级响应(如缓存值、空数组),不抛给上层
四、进程级兜底:防止死循环吃满 CPU 导致事件循环瘫痪
恶意慢速流可能触发正则回溯、无限 while 或未休眠的自定义进程,导致单核 CPU 打满、epoll 空转。需快速定位+安全止血。
- 用 strace -tt -p PID 观察是否高频出现 epoll_pwait(..., timeout=0) 返回 0
- 用 mpstat -P ALL 1 确认是否单核 %usr ≥95%,且 %wa 极低
- 定位后优先发 kill -15 让 Worker 主动退出当前循环;无响应再 kill -9
- 代码层加防护:正则加 PREG_BACKTRACK_LIMIT、自定义循环强制 usleep(1000)、协程任务设最大执行时间










