You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP使用Curl获取JSON遇异常:HTTP/2错误或HTTP/1.1超时

PHP Curl请求JSON遇HTTP/2错误或HTTP/1.1超时的解决方案

问题说明

使用PHP Curl请求JSON数据时出现两种异常:

  1. 默认调用返回错误:Curl error: HTTP/2 stream 0 was not closed cleanly: INTERNAL_ERROR (err 2)
  2. 指定CURL_HTTP_VERSION_1_1后请求超时,但该URL在浏览器中可正常访问。

原测试代码:

$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, $url);
curl_setopt($curlSession, CURLOPT_HEADER, 0);
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

if($curlReturn = curl_exec($curlSession) === false){
    echo 'Curl error: ' . curl_error($curlSession);
    curl_close($curlSession);
} else {
    // 处理返回数据
}

可行解决方案

1. 完全模拟浏览器请求头

服务器往往会校验请求头的完整性,Curl默认头部过于简单,易被拦截。直接复制浏览器的请求头(通过开发者工具Network面板查看)进行模拟:

$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, $url);
curl_setopt($curlSession, CURLOPT_HEADER, 0);
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

// 模拟Chrome浏览器的完整请求头
curl_setopt($curlSession, CURLOPT_HTTPHEADER, [
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Accept: application/json, text/plain, */*',
    'Accept-Language: zh-CN,zh;q=0.9',
    'Referer: https://example.com/', // 替换为目标URL的来源页
    'Connection: keep-alive'
]);

// 自动跟随重定向
curl_setopt($curlSession, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curlSession, CURLOPT_MAXREDIRS, 5);

$curlReturn = curl_exec($curlSession);
if($curlReturn === false){
    echo 'Curl error: ' . curl_error($curlSession);
} else {
    $data = json_decode($curlReturn, true);
    var_dump($data);
}
curl_close($curlSession);

2. 调整SSL与超时设置

部分服务器的SSL配置或网络环境会导致请求卡住,可临时关闭证书验证(仅测试用)并延长超时时间:

$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, $url);
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

// 测试环境临时禁用SSL验证(生产环境请指定CA证书路径)
curl_setopt($curlSession, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlSession, CURLOPT_SSL_VERIFYHOST, false);

// 延长连接和请求超时
curl_setopt($curlSession, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($curlSession, CURLOPT_TIMEOUT, 30);

$curlReturn = curl_exec($curlSession);
// 后续处理逻辑同上
curl_close($curlSession);

3. 开启调试日志定位问题

通过Curl的 verbose 日志查看请求全流程,找出超时或报错的具体环节:

$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, $url);
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

// 开启调试日志
$debugFile = fopen('curl_debug.log', 'w');
curl_setopt($curlSession, CURLOPT_VERBOSE, true);
curl_setopt($curlSession, CURLOPT_STDERR, $debugFile);

$curlReturn = curl_exec($curlSession);
fclose($debugFile);
// 后续处理逻辑同上
curl_close($curlSession);

4. HTTP/1.1下调整TCP参数

指定HTTP/1.1后超时,可尝试开启TCP_NODELAY优化传输:

$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, $url);
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlSession, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curlSession, CURLOPT_TCP_NODELAY, true);

$curlReturn = curl_exec($curlSession);
// 后续处理逻辑同上
curl_close($curlSession);

关键排查点

  • 对比浏览器与Curl的请求头差异,确保所有关键字段(如User-Agent、Referer)一致
  • 检查服务器是否有反爬策略,是否需要携带Cookie或其他验证信息
  • 确认服务器所在网络是否允许服务器端(而非浏览器)发起请求

内容的提问来源于stack exchange,提问作者Jeppe Donslund

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:10:21