response->end() 被卡住但没报错,通常不是超时而是协程阻塞(如同步i/o、死循环);真超时仅发生在 swoole_timer_after 主动清理或tcp连接被强制关闭写入失败时,需通过前后时间戳差值与设定阈值比对确认。

response->end() 被卡住但没报错,怎么确认是不是超时?
不是所有“响应慢”都等于超时。Swoole 的 response->end() 调用后若迟迟不返回,常见原因是协程阻塞(比如同步 I/O、未 await 的协程、死循环),而非 HTTP 层超时。真正的超时触发点有两个:swoole_timer_after 主动清理,或底层 TCP 连接被对端/中间设备强制关闭后写入失败。
先检查是否真发生了超时:在 on('request') 中加日志,记录 microtime(true) 时间戳;再在 response->end() 前再打一次。如果差值远大于你设的超时阈值(比如设了 3 秒,却耗时 8 秒),那大概率是业务逻辑阻塞,不是超时机制生效。
- 用
swoole_timer_after()手动兜底时,必须配合Swoole\Timer::exists($timer_id)判断定时器是否还存活,否则可能重复 end 或写入已关闭连接 -
response->status(504)->end()必须在定时器回调里执行,不能只靠业务逻辑“自己结束” - 如果
response->write()抛出Swoole\Exception(如client connection closed),说明连接已断——这不是超时设置问题,而是客户端提前断开或 NAT 老化
swoole_http_client->set(['timeout' => X]) 不生效?
这个 timeout 是客户端发请求时用的,和 HTTP 服务器自身的响应超时无关。它只控制 swoole_http_client 实例发起请求后,等待服务端返回响应的最大时间。设为 3.0 表示:连接建立成功后,3 秒内没收到任何响应数据,就主动断连,$response->statusCode 会是 -2。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 该配置仅在 Swoole 1.9.14+ 有效,旧版本需拆成
connect_timeout和read_timeout - 设为
-1表示禁用超时检测,但高并发下极易导致协程堆积,不建议线上使用 - 注意:它不影响服务端处理逻辑,只影响客户端感知。服务端仍会继续执行,直到自然结束或被其他机制中断(如
max_request)
为什么 on('request') 里 sleep(5) 没被 timeout 干掉?
Swoole HTTP Server 本身**不提供自动响应超时机制**。它不会因为你设了某个全局参数,就在 3 秒后自动 kill 掉正在执行的请求协程。所谓“超时”,必须由你显式编码实现:要么用 swoole_timer_after 主动响应并关闭,要么用 go(function () { ... }) 包裹耗时操作并加超时判断。
- 直接在
on('request')回调里写sleep(5)或file_get_contents(),会阻塞当前协程,但不会触发任何超时逻辑 - 正确姿势是把耗时操作放进独立协程,并在主协程中启动定时器监控;一旦超时,调用
$response->end(),同时在子协程里检查是否已被清理(用Coroutine::stats()或共享 flag) - 别依赖 PHP 的
set_time_limit(),它在协程环境下无效
CDN / Nginx 后面的 Swoole,超时到底谁说了算?
链路越长,超时越容易被覆盖。典型部署是:用户 → CDN → Nginx → Swoole。这时有至少 4 层超时可配:CDN 边缘超时、Nginx proxy_read_timeout、Swoole 客户端 timeout、Swoole 服务端手动定时器。只要其中任意一层先触发,下游就收不到完整响应。
- Nginx 默认
proxy_read_timeout是 60 秒,如果你的 Swoole 定时器设了 3 秒,但 Nginx 卡在等响应,用户看到的仍是 60 秒后才报错 - CDN 通常有更短的默认超时(如 15 秒),且不开放配置,此时即使后端 Swoole 处理很快,CDN 也可能先断连
- 排查时务必逐层看日志:CDN access log、Nginx error log(搜
upstream timed out)、SwooleonClose事件触发时间










