我正在尝试从一个服务器到另一个服务器访问 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);
Run Code Online (Sandbox Code Playgroud)
查询与此链接中询问的相同curl php HTTP/2 stream 0 was not closed cleanly
再次询问,因为在之前的链接中没有找到解决方案,即使在任何其他位置也没有。
Hen*_*son 16
我遇到了这个完全相同的问题,@CodyKL 的评论实际上解决了我的问题,所以我想我会把它变成供其他人参考的答案。
简短的回答:
将以下行添加到您的 curl 请求中,一切都将得到解决
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
Run Code Online (Sandbox Code Playgroud)
稍微长一点的答案:
从 curl 7.62.0 开始,默认选项是: CURL_HTTP_VERSION_2TLS
在此之前,默认值是: CURL_HTTP_VERSION_1_1
一些较旧的 API 等似乎与最新的 HTTP 版本不兼容。较新版本的 CURL 将默认使用此协议,因此会失败。这可能会导致一些相当混乱的行为,因为在一台机器上运行的脚本可能不一定在另一台机器上运行。为了最大限度地提高兼容性,您最好为不支持 CURL_HTTP_VERSION_2TLS 的旧服务器的 curl 请求指定 CURLOPT_HTTP_VERSION。