curl_upkeep仅用于http/2连接保活,通过发送ping帧防止空闲连接被中间设备断开;不适用于http/1.1,且需满足已建立http/2连接、libcurl≥7.62.0等前提。

curl_upkeep 不是用来“保持长连接”的通用手段,它只在 HTTP/2 连接上生效,作用是主动发送 PING 帧防止空闲连接被中间设备(如防火墙、代理)断开。
curl_upkeep 的适用前提
这个函数不是为 HTTP/1.1 设计的,也不参与 Keep-Alive 协商。它的存在前提是:
- 已启用 HTTP/2 协议(
CURLOPT_HTTP_VERSION设为CURL_HTTP_VERSION_2_0或CURL_HTTP_VERSION_2TLS) - cURL 句柄处于活跃的 HTTP/2 连接状态(首次请求已成功完成)
- 服务端实际支持 HTTP/2 并未降级到 HTTP/1.1(可用
curl_getinfo($ch, CURLINFO_HTTP_VERSION)验证)
如何正确调用 curl_upkeep
它不接收额外参数,只需传入有效的 cURL 句柄,调用后由 cURL 底层自动触发 PING:
- 必须在已有连接建立后调用,比如首次请求成功后、下一次请求前
- 建议配合
CURLOPT_UPKEEP_INTERVAL_MS设置间隔(单位毫秒),例如 2000 表示每 2 秒尝试一次保活 - 调用返回
true表示指令已提交,不代表 PING 已发出或收到响应;失败通常意味着连接已关闭或协议不匹配
HTTP/1.1 下别指望 curl_upkeep 起作用
如果你用的是 HTTP/1.1,Keep-Alive 是否生效取决于:
- 客户端显式发送
Connection: keep-alive头(curl_setopt($ch, CURLOPT_HTTPHEADER, ['Connection: keep-alive'])) - 服务端返回
Connection: keep-alive且未带Connection: close - 复用同一个 cURL 句柄发起后续请求(这才是关键,不是靠函数调用)
- 中间设备(Nginx、CDN、负载均衡)未强制改写或关闭连接
真正可靠的长连接实践
无论 HTTP/1.1 还是 HTTP/2,稳定复用连接的核心操作是一致的:
- 初始化一次
curl_init(),全程复用该句柄 - 每次请求前仅更新必要选项:URL、POST 数据、超时等,避免重置连接相关配置
- 设置合理超时:
CURLOPT_CONNECTTIMEOUT控制建连,CURLOPT_TIMEOUT控制整体耗时 - 检查服务端响应头,确认是否返回了
Connection: keep-alive或使用了 HTTP/2
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











