Php Curl:传输结束,剩余未完成的读取数据

Php Curl:传输结束,剩余未完成的读取数据,php,curl,Php,Curl,我有一个大卷发电话的问题 我明白了 nreadlibcurl只告诉您,连接被服务器以一种不干净的方式切断,而服务器没有提供它承诺要提供的数据。看起来分块编码并没有表示传输结束 浏览器因其接收内容的极端自由而臭名昭著,因此他们忽略了所有违反协议的行为,其程度远远超过libcurl。好的,在进行了一些搜索和IRC聊天后,我找到了解决方案,但不是100%确定原因是什么。看起来keep alives发送的信息不足以保持连接。我会在这里发布解决方案,希望我能帮助别人 对我有帮助的是添加 --keepal

我有一个大卷发电话的问题

我明白了


  • nreadlibcurl只告诉您,连接被服务器以一种不干净的方式切断,而服务器没有提供它承诺要提供的数据。看起来分块编码并没有表示传输结束


    浏览器因其接收内容的极端自由而臭名昭著,因此他们忽略了所有违反协议的行为,其程度远远超过libcurl。

    好的,在进行了一些搜索和IRC聊天后,我找到了解决方案,但不是100%确定原因是什么。看起来keep alives发送的信息不足以保持连接。我会在这里发布解决方案,希望我能帮助别人

    对我有帮助的是添加

    --keepalive-time 2
    
    对curl选项的解释

    --keepalive-time <seconds>
    
    我正在osx上运行这个版本的curl

    curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
    Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
    Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets
    
    如果有人希望在PHP curl中使用此选项,--keepalive time选项从PHP5.5开始就可用。您可以按如下方式使用它:

    curl_setopt($connection, CURLOPT_TCP_KEEPALIVE, 1);
    curl_setopt($connection, CURLOPT_TCP_KEEPIDLE, 2);
    

    希望这有助于解决同一问题的人

    遇到类似问题,我的服务器在nginx后面。如果Curl直接连接到服务器,则它能够接收响应,但如果Curl通过nginx连接到服务器,则Curl抛出以下错误

    会话
    *传输关闭,未完成的读取数据剩余
    *关闭连接0卷曲:(18)传输已关闭,未完成 读取剩余数据

    当我使用浏览器连接到同一个nginx URL时,响应显示良好。这很奇怪,当我尝试使用curl连接到同一个nginx URL时,它抛出了上述错误

    比较浏览器和curl发送的标题后。我发现浏览器能够接收响应,因为curl没有发送以下标题:

    'Accept-Encoding: gzip'
    
    使用curl发送上面的标题工作正常。所以,上面的头所做的是将响应压缩到gzip,从而减小响应大小

    经过进一步挖掘,发现nginx无法发送任何大于80kb的有效负载。在浪费了很多时间后,发现问题在于nginx缓冲,nginx在nginx.conf中添加了下面的proxy_buffering属性后工作得非常出色:

     location / {
     proxy_buffering off;
     }
    

    被接受的答案并没有解决我的问题。写下这个答案,这样任何人都不必浪费他们的时间,如果他们面临与我相同的问题。

    遇到类似的问题,我的服务器也支持nginx。 web服务器(flask)日志中没有错误,但在nginx日志中发现了一些错误消息

    [crit]31054#31054:*269464 open()“/var/cache/nginx/proxy_temp/3/45/0000000 453”在读取上游时失败(13:权限被拒绝)


    我通过更正目录“/var/cache/nginx”的权限来解决此问题。

    您是在攻击负载平衡器后面的服务器还是miracloud之类的DDOS保护?出于安全原因,他们可能会关闭长连接,即使您有数据流。我无法控制远程服务器。但是它在chrome中的加载非常完美。如何在php
    Guzzle/HttpClient
    中添加
    CURLOPT_-TCP_-KEEPALIVE
    CURLOPT_-TCP_-KEEPIDLE
    ?@user6067756您只需将它们作为curl设置传递即可:有类似的问题。这修复了它,但不确定是否有其他设置可使用:例如。
    curl_setopt($connection, CURLOPT_TCP_KEEPALIVE, 1);
    curl_setopt($connection, CURLOPT_TCP_KEEPIDLE, 2);
    
    'Accept-Encoding: gzip'
    
     location / {
     proxy_buffering off;
     }