我遇到这个奇怪的错误, 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..... 之前升级操作系统。
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也存在一些严重的错误…我建议您使用较新版本的PHP和CURL
PHP/5.3.3
PHP
CURL
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则很可能必须在配置过程中进行更改
VPN
D. 防火墙:iptables
如果您不知道如何解决这些问题,可能会导致一些严重的问题..尝试访问您要连接的服务器以检查以下内容
例
-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
You need to update your system
A. SSL
如果Yii::app()->params['pdfUrl']url中https未包含正确的SSL设置,则在旧版本的curl中也会导致此错误
Yii::app()->params['pdfUrl']
https
解决方法:确保已安装并启用了OpenSSL,然后将其添加到您的代码中
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
希望对您有所帮助