首页 > 解决方案 > PHP Curl 错误 HTTP/2 流 0 未完全关闭:PROTOCOL_ERROR (err 1)

问题描述

我正在尝试从一台服务器到另一台服务器的 API 并在curl_error($curl); HTTP/2 流 0 中获得此响应没有完全关闭: PROTOCOL_ERROR (err 1)。收到此错误消息的频率很低,在 10 次尝试中只有 1 到 2 次。

但是为什么我会收到这个错误,是我失踪的任何具体原因吗?

我的卷曲代码是:

$data = http_build_query(array('param1' => 'test','status' => 'Success'));
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, "server api link");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($curl);
if (curl_error($curl)) {
    $error_msg = curl_error($curl);
}

print_r($error_msg);
curl_close($curl);

查询与此链接中询问的相同curl php HTTP/2 流 0 未完全关闭

再次询问它,因为在上一个链接中没有找到解决方案,即使在任何其他位置也没有。

标签: phpcurl

解决方案


我遇到了同样的问题,@CodyKL 的评论实际上解决了我的问题,所以我想我会把它变成一个答案供其他人参考。

简短的回答:

将以下行添加到您的 curl 请求中,一切都将得到解决

curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

稍微长一点的答案:

从 curl 7.62.0 开始,默认选项是:CURL_HTTP_VERSION_2TLS

在此之前,默认值曾经是:CURL_HTTP_VERSION_1_1

一些较旧的 API 等似乎与最新的 HTTP 版本不兼容。较新版本的 CURL 将默认使用此协议,因此会失败。这可能会导致一些相当混乱的行为,因为在一台机器上运行的脚本可能不一定在另一台机器上运行。为了最大限度地提高兼容性,您最好为不支持 CURL_HTTP_VERSION_2TLS 的旧服务器的 curl 请求指定 CURLOPT_HTTP_VERSION。


推荐阅读