首页 文章

CURL错误:Recv失败:通过对等方重置连接 - PHP Curl

提问于
浏览
54

我有这个奇怪的错误, CURL ERROR: Recv failure: Connection reset by peer

这就是它发生的方式,如果我没有连接到服务器并突然试图通过PHP中的CURL连接到服务器我得到错误 . 当我再次运行CURL脚本时,错误消失,然后一直运行良好,如果我让远程服务器空闲大约30分钟或重新启动远程服务器并尝试再次连接,我再次收到错误 . 所以似乎连接是空闲的,然后突然服务器唤醒然后工作然后再次睡眠 .

这就是我的CURL脚本的外观 .

$url = Yii::app()->params['pdfUrl'];
            $body = 'title='.urlencode($title).'&client_url='.Yii::app()->params['pdfClientURL'].'&client_id='.Yii::app()->params['pdfClientID'].'&content='.urlencode(htmlentities($content));

            $c = curl_init ($url);
            $body = array(
                "client_url"=>Yii::app()->params['pdfClientURL'],
                "client_id"=>Yii::app()->params['pdfClientID'],
                "title"=>urlencode($title),
                "content"=>urlencode($content)

            );
            foreach($body as $key=>$value) { $body_str .= $key.'='.$value.'&'; }
                rtrim($body_str,'&');

            curl_setopt ($c, CURLOPT_POST, true);
            curl_setopt ($c, CURLOPT_POSTFIELDS, $body_str);
            curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
            curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
            curl_setopt ($c, CURLOPT_TIMEOUT  , 20);

            $pdf = curl_exec ($c);
            $errorCode = curl_getinfo($c, CURLINFO_HTTP_CODE);
            $curlInfo = curl_getinfo($c);
            $curlError = curl_error($c);

            curl_close ($c);

我完全没有想法和解决方案,请帮助,我会很感激!!!

如果我详细说明输出,看看会发生什么

curl_setopt ($c, CURLOPT_VERBOSE, TRUE);
curl_setopt($c, CURLOPT_STDERR, $fp);

我得到以下内容

* About to connect() to 196.41.139.168 port 80 (#0)
*   Trying 196.x.x.x... * connected
* Connected to 196.x.x.x (196.x.x.x) port 80 (#0)
> POST /serve/?r=pdf/generatePdf HTTP/1.1
Host: 196.x.x.x
Accept: */*
Content-Length: 7115
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue

* Recv failure: Connection reset by peer
* Closing connection #0
012 20:23:49 GMT
< Server: Apache/2.2.15 (CentOS)
< X-Powered-By: PHP/5.3.3
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
< 
* Closing connection #0

我在下面的脚趾中添加了删除默认 Headers 但仍然没有运气:

curl_setopt ($c, CURLOPT_HTTPHEADER, array( 'Expect:' ) );

> Accept: */* Content-Length: 8414 Content-Type:
> application/x-www-form-urlencoded
> 
> * Recv failure: Connection reset by peer
> * Closing connection #0 r: Apache/2.2.15 (CentOS) < X-Powered-By: PHP/5.3.3 < Connection: close < Transfer-Encoding: chunked <
> Content-Type: text/html; charset=UTF-8 < 
> * Closing connection #0

6 回答

  • 10

    简介

    远程服务器向您发送了一个RST数据包,表明连接立即丢弃,而不是通常的握手 .

    可能的原因

    A. TCP/IP

    可能是您需要解决主机或升级操作系统的TCP / IP问题,大多数时候连接在远程服务器关闭之前,在完成下载内容之前导致 Connection reset by peer .....

    B. Kannel Bug

    请注意,在v2.6.17之后,某些Linux内核上的TCP窗口缩放存在一些问题 . 有关更多信息,请参阅以下错误报告:

    https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.17/+bug/59331

    https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/89160

    C. PHP & CURL Bug

    你正在使用 PHP/5.3.3 ,它也有一些严重的错误......我建议你使用更新版本的 PHPCURL

    https://bugs.php.net/bug.php?id=52828

    https://bugs.php.net/bug.php?id=52827

    https://bugs.php.net/bug.php?id=52202

    https://bugs.php.net/bug.php?id=50410

    D. Maximum Transmission Unit

    此错误的一个常见原因是通过网络连接传输的数据包的MTU(最大传输单元)大小已从默认的1500字节更改 . 如果您已配置 VPN ,则最有可能在配置期间更改

    D. Firewall : iptables

    如果你不知道你的方式他们会导致一些严重的问题..尝试访问你连接的服务器检查以下内容

    • 您可以访问该服务器上的端口80

    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT`
    
    • 以下是在任何其他ACCEPT之前的最后一行

    -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
    
    • 检查所有DROP,REJECT并确保它们没有阻止您的连接

    • 临时允许所有连接,看看它是否通过

    实验

    尝试不同的服务器或远程服务器(这么多费用 Cloud 在线托管)并测试相同的脚本..如果它工作,那么我猜测是真的一样好... You need to update your system

    其他代码相关

    A. SSL

    如果 Yii::app()->params['pdfUrl']https 不包含正确的SSL设置的网址也会导致旧版curl中出现此错误

    解决方案:确保已安装并启用OpenSSL,然后将其添加到您的代码中

    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
    

    我希望它有所帮助

  • 0

    通常,此错误表示已与服务器 Build 连接,但该连接已由远程服务器关闭 . 这可能是由于服务器速度慢,远程服务器出现问题,网络问题,或者(可能)某种安全错误,数据被发送到远程服务器,但我发现这不太可能 .

    通常情况下,网络错误会在一段时间内自行解决,但听起来您已经花了一些时间 .

    cURL有时会出现SSL和SSL证书问题 . 我认为您的Apache和/或PHP是使用最新版本的cURL和cURL SSL库编译的,我不认为您的Web服务器中安装了OpenSSL .

    虽然我不能确定但是,我相信cURL在历史上一直是SSL证书,而Open SSL却没有 .

    无论如何,尝试在服务器上安装Open SSL并再试一次,这应该可以帮助您摆脱这个错误 .

  • 87

    那么 Yii::app()->params['pdfUrl'] 给出的URL是什么?你说它应该是https,但日志显示它在端口80上连接...几乎没有服务器设置为接受https连接 . cURL很聪明,知道https应该在端口443上...这表明你的URL有一些不可思议的东西,如: https://196.41.139.168:80/serve/?r=pdf/generatePdf

    当另一端的Apache无法在该端口上与您进行https通信时,这将导致连接终止 .

    当你将 $body 设置为两行后的数组时,你会意识到你的第一个 $body 定义被替换了吗? {可能只是你试图解决问题的一件神器}你也没有编码 client_urlclient_id 值(前者很可能包含需要转义的字符!)哦,如果没有先初始化它你就会追加到 $body_str .

    从您的详细输出中我们可以看到cURL正在添加 content-length 标头,但是......它是否正确?我可以在这个数字的互联网上看到一些错误的评论(特别是旧版本)...如果这个数字很小(例如)在发送所有数据之前,您将获得连接重置 . 您可以手动插入 Headers :

    curl_setopt ($c, CURLOPT_HTTPHEADER, 
       array("Content-Length: ". strlen($body_str)));
    

    哦,还有一个方便的函数http_build_query,它会将一组名称/值对转换为URL编码的字符串 .

    所有这些都汇总到最终代码中:

    $post=http_build_query(array(
      "client_url"=>Yii::app()->params['pdfClientURL'],
      "client_id"=>Yii::app()->params['pdfClientID'],
      "title"=>$title,
      "content"=>$content));
    
    //Open to URL
    $c=curl_init(Yii::app()->params['pdfUrl']);
    //Send post
    curl_setopt ($c, CURLOPT_POST, true);
    //Optional: [try with/without]
    curl_setopt ($c, CURLOPT_HTTPHEADER, array("Content-Length: ".strlen($post))); 
    curl_setopt ($c, CURLOPT_POSTFIELDS, $post);
    curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
    curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
    curl_setopt ($c, CURLOPT_TIMEOUT  , 20);
    //Collect result
    $pdf = curl_exec ($c);
    $curlInfo = curl_getinfo($c);
    curl_close($c);
    
  • 0

    这是一个防火墙问题,如果您使用的是VMware应用程序,请确保防病毒软件的防火墙已关闭或允许连接 .

    如果此服务器位于安全网络上,请查看服务器的防火墙规则 .

    谢谢Ganesh PNS

  • 1

    在我的情况下,URL中存在问题 . 我使用https://example.com - 但是他们确保'www.' - 所以当我切换到https://www.example.com时一切都还好 . 正确的 Headers 已发送'Host: www.example.com' .

    您可以尝试在firefox brwoser中提出请求,坚持并复制为cURL - 我是如何找到它的 .

  • 3

    我遇到了同样的错误,但方式不同 .

    使用特定SSL协议卷曲页面时 .

    curl --sslv3 https://example.com
    

    如果目标服务器不支持--sslv3,则错误将是

    curl:(35)通过对等方重置TCP连接

    使用支持的协议,错误将消失 .

    curl --tlsv1.2 https://example.com
    

相关问题