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

PHP中cURL请求指定API报HTTP/2流未正常关闭错误求助

解决cURL请求特定API时的HTTP/2流错误(错误92)及HTTP/1.1挂起问题

针对你遇到的cURL请求https://api.beta.tab.com.au/v1/tab-info-service/racing/dates/YYYY-MM-DD/meetings?jurisdiction=VIC出现的错误92(HTTP/2流未正常关闭),以及强制HTTP/1.1时脚本挂起的问题,给出以下针对性解决方案:

1. 调整HTTP/2配置并添加请求头模拟

目标服务器可能对HTTP/2的默认配置不兼容,同时可能拦截非浏览器风格的请求。修改你的cURL函数,添加HTTP/2强制配置、合理超时和浏览器请求头:

function fetchDataFromUrl($url) {
    $ch = curl_init();
    $connectTimeout = 5;
    $totalTimeout = 10; // 设置整体请求超时,避免无响应挂起

    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 0);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $connectTimeout);
    curl_setopt($ch, CURLOPT_TIMEOUT, $totalTimeout); // 新增整体超时

    // 强制HTTP/2并启用ALPN协商
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
    curl_setopt($ch, CURLOPT_SSL_ENABLE_ALPN, true);

    // 模拟浏览器请求头,避免服务器拦截
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
        'Accept: application/json, text/plain, */*',
        'Accept-Language: en-US,en;q=0.9',
        'Connection: keep-alive'
    ]);

    $data = curl_exec($ch);
    
    $curl_error = curl_error($ch);
    $curl_error_number = curl_errno($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if(curl_errno($ch)) {
        $error_message = 'Error: ' . curl_error($ch);
        echo "cURL error: $error_message | cURL error number: $curl_error_number | http code: $http_code\n";
        curl_close($ch);
        return $error_message;
    } else {
        curl_close($ch);
        echo "cURL success\n";
        return $data;
    }
}

2. 禁用HTTP/2多路复用

部分服务器对HTTP/2的多路复用支持不佳,添加以下配置禁用:

// 在curl_setopt中添加这一行
curl_setopt($ch, CURLOPT_HTTP2_PUSH, false);

3. 检查cURL和OpenSSL版本兼容性

旧版本的cURL(<7.40)或OpenSSL(<1.1.1)的HTTP/2实现存在兼容性问题,执行以下代码查看当前版本:

echo "cURL version: " . curl_version()['version'] . "\n";
echo "OpenSSL version: " . curl_version()['ssl_version'] . "\n";

如果版本过低,建议升级对应的扩展或服务器环境。

4. 修复HTTP/1.1挂起问题

若强制使用HTTP/1.1时脚本挂起,添加特定请求头并禁用连接复用:

// 替换HTTP版本配置为1.1
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
// 添加请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Expect: 100-continue',
    'Transfer-Encoding: chunked'
]);
// 禁用连接复用,避免复用异常连接
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:57:31