当前位置: 首页 > 面试题库 >

CURL错误:接收失败:对等重置连接-PHP Curl

章振
2023-03-14
问题内容

我遇到这个奇怪的错误, CURL错误:接收失败:对等连接重置

如果我没有连接到服务器,而突然尝试通过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

我在下面的脚趾中添加了默认标题,但仍然没有运气:

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

问题答案:

介绍

远程服务器已向您发送了一个RST数据包,该数据包指示立即断开连接,而不是通常的握手。

可能的原因

A. TCP / IP

这可能是TCP / IP问题,您需要与主机一起解决或在大多数情况下在远程服务器关闭连接,然后才完成将内容下载到Connection reset by peer..... 之前升级操作系统

B. 康奈尔虫子

请注意,在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和卷曲的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. 最大传输单位

导致此错误的一个常见原因是,通过网络连接传输的数据包的MTU(最大传输单元)大小已从默认的1500字节更改。如果已配置,VPN则很可能必须在配置过程中进行更改

D. 防火墙:iptables

如果您不知道如何解决这些问题,可能会导致一些严重的问题..尝试访问您要连接的服务器以检查以下内容

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

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

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

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

实验

尝试使用其他服务器或远程服务器(在线托管如此多的费用云服务)并测试相同的脚本..如果它可以工作,那么我猜是一样的不错… You need to update your system

其他代码相关

A. SSL

如果Yii::app()->params['pdfUrl']url中https未包含正确的SSL设置,则在旧版本的curl中也会导致此错误

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

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

希望对您有所帮助



 类似资料:
  • 问题内容: 我使用以下Dockerfile构建一个Rails应用容器: 构建成功: 容器正在运行: 并且正在导出3000 / tcp端口: 但无法从“内部”或“外部” Docker访问服务器: 但一切似乎还可以: 我也在浏览器中尝试过,但是什么也没有。主机系统是: 任何的想法? 问题答案: Rails服务器文档指出服务器默认情况下绑定到,这通常会阻止dockerized应用程序接受连接。尝试将其更

  • 错误:无法启动连接:错误:WebSocket无法连接。在服务器上找不到连接,endpoint可能不是信号器endpoint,服务器上不存在连接ID,或者存在阻止WebSocket的代理。如果有多台服务器,请检查是否启用了粘性会话。 WebSocketTransport.js:49WebSocket连接到“ws://xxxxxx/生产/网络服务/集线器/spreadhub”失败: Angular.t

  • 我使用HttpClient4.4发送get和post请求。并且我刚刚创建了一个httpclient的simpile包装器以方便使用: 当我使用这个类发送post请求时。奇怪的事情发生了: 第一次,我向服务器发送一个post请求,一分钟后就可以了,我向服务器发送一个同样的请求,也可以了。但几分钟后,我发出了一个同样的请求,有些不对劲: 但是,我仍然向服务器发送一个相同的请求,它又可以了。 每次我按照

  • 我正在使用webCareet来使用OAuth2安全服务。当服务花费的时间超过默认超时时,我会低于错误并重试请求。 io.netty.channel.unix.错误$NativeEceptionIoException: read地址失败:连接被对等方重置连接观察到错误,请求将被重试。这似乎是netty的IO异常问题。 在这种情况下如何避免重试? 这是我的webclient配置-

  • 我在Laravel 4.2应用程序中使用RabbitMQ库videlvalvaro/php amqplib,开始出现以下错误: 有人能提出任何可能导致这种情况的建议吗?