使用curl从URL检索数据时,有时(在80%的情况下)
错误18:传输关闭,剩余未完成的读取数据
然后缺少部分返回的数据。奇怪的是,当CURLOPT_RETURNTRANSFER设置为false时,这永远不会发生,即curl_exec函数不会返回数据而是直接显示内容。
可能是什么问题呢?我可以设置一些选项来避免这种行为吗?
使用curl从URL检索数据时,有时(在80%的情况下)
错误18:传输关闭,剩余未完成的读取数据
然后缺少部分返回的数据。奇怪的是,当CURLOPT_RETURNTRANSFER设置为false时,这永远不会发生,即curl_exec函数不会返回数据而是直接显示内容。
可能是什么问题呢?我可以设置一些选项来避免这种行为吗?
Connection: Close
标题吗?如果是这样,请尝试使用Connection: Keep-Alive
,Keep-Alive: ***
而***是您可以选择的数字(为了安全起见,可能为10秒;大多数现代浏览器使用300,即5分钟)。
Answers:
我敢打赌这与Content-Length
同行发送的错误标题有关。我的建议是让curl自行设置长度。
错误字符串完全就是libcurl看到的内容:由于它正在接收分块的编码流,因此它知道何时在分块中还有剩余的数据要接收。关闭连接后,libcurl知道最后收到的块不完整。然后,您得到此错误代码。
您无法采取任何措施来避免在未修改请求的情况下发生此错误,但是您可以尝试通过发出HTTP 1.0请求来解决该错误(因为此时不会进行分块编码),但事实是,这很可能是一个缺陷在服务器或您的网络/设置中。
我遇到了同样的问题,但是设法通过抑制cURL通常发送的“期望:100-继续”标头来解决(以下是PHP代码,但应该与其他cURL API相似地工作):
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:'));
顺便说一句,我正在将调用发送到JDK 6 REST内容中包含的HTTP服务器,这会遇到各种问题。在这种情况下,它首先发送100响应,然后对某些请求不能正确发送后续的200响应。
curl -H 'Expect:' ...
希望对您
$curl
到任何它被称为在码)。
在使用Guzzle时也会看到此错误。以下标头为我修复了该标头:
'headers' => [
'accept-encoding' => 'gzip, deflate',
],
我向邮递员发出了请求,这给了我完整的答复,没有错误。然后,我开始添加Postman发送到Guzzle请求的标头,而这正是解决该问题的标头。
我在使用pycurl时遇到了这个问题,并且使用
c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_0)
就像埃里克·卡隆(Eric Caron)所说。
我已经通过这种方式解决了这个错误。
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, 'http://www.someurl/' );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 30);
ob_start();
$response = curl_exec ( $ch );
$data = ob_get_clean();
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200 ) success;
错误仍然会发生,但是我可以处理变量中的响应数据。