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
相关产品推荐
相关产品推荐

