PHP cURL POST 请求被缓存的典型表现是返回旧数据,即使修改参数也无效;主因包括cURL连接复用、服务端(Nginx/CDN)或代理误缓存POST请求。
PHP cURL POST 请求被缓存的典型表现
用 curl_exec() 发 POST 请求,却返回了上次请求的老数据,尤其是和 API 交互时反复拿到相同响应,甚至改了 POST 参数也没用——这不是服务端没更新,很可能是 PHP 的 cURL 复用了连接,或服务端(如 Nginx、CDN)对特定请求路径做了响应缓存。更隐蔽的是,某些代理或中间件会把 POST 当作可缓存请求(虽然不符合 HTTP 规范),尤其当请求头缺失或不规范时。
强制禁用服务端缓存的关键请求头
在 curl_setopt() 中设置以下头,能大幅降低被缓存概率:
Cache-Control: no-cache, no-store, must-revalidatePragma: no-cacheExpires: 0- 额外加一个动态参数(如
timestamp或rand)到 POST body 或 URL query,打破请求指纹一致性
注意:仅设 Cache-Control 不够,Pragma 和 Expires 对老旧代理更有效;如果服务端用 Vary 头做缓存区分,还要确保 Content-Type 稳定(比如始终用 application/x-www-form-urlencoded 而不是有时用 json)。
避免 cURL 连接复用导致的“假缓存”
cURL 默认启用连接池(CURLOPT_HTTPHEADER 以外的复用逻辑),若连续发相同 URL+方法的请求,可能复用上一次的响应缓冲。解决方式是显式关闭复用:
立即学习“PHP免费学习笔记(深入)”;