卷曲错误:Recv 失败:对等方重置连接 - PHP 卷曲

2022-08-30 08:06:22

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

这就是它是如何发生的,如果我没有连接到服务器,并且突然尝试通过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

答案 1

介绍

远程服务器已向您发送 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 & CURL Bug

您正在使用,其中也有一些严重的错误...我建议您使用最新版本的和PHP/5.3.3PHPCURL

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 字节更改为 1500 字节。如果已配置,则很可能必须在配置期间更改VPN

D. 防火墙: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 
  • 检查所有丢弃,拒绝并确保它们不会阻止您的连接

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

实验

尝试在其他服务器或远程服务器上(如此多的免费云托管在线)并测试相同的脚本。如果它有效,那么我的猜测是正确的...You need to update your system

其他代码相关

A. 断续器

如果是不包含正确SSL设置的URL也可能导致旧版本的curl中的此错误Yii::app()->params['pdfUrl']https

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

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

答案 2

通常,此错误意味着与服务器建立了连接,但远程服务器关闭了该连接。这可能是由于服务器速度慢,远程服务器问题,网络问题或(可能)数据发送到远程服务器的某种安全错误,但我发现这不太可能。

通常,网络错误会在一段时间内自行解决,但听起来您已经给了它一点时间。

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

虽然我不能确定但是,我相信cURL历来与SSL证书一样混乱,而Open SSL则没有。

无论如何,请尝试在服务器上安装Open SSL,然后重试,这应该可以帮助您摆脱此错误。


推荐