我有这个奇怪的错误, 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 回答
简介
远程服务器向您发送了一个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
,它也有一些严重的错误......我建议你使用更新版本的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. Maximum Transmission Unit
此错误的一个常见原因是通过网络连接传输的数据包的MTU(最大传输单元)大小已从默认的1500字节更改 . 如果您已配置
VPN
,则最有可能在配置期间更改D. Firewall : iptables
如果你不知道你的方式他们会导致一些严重的问题..尝试访问你连接的服务器检查以下内容
例
例
检查所有DROP,REJECT并确保它们没有阻止您的连接
临时允许所有连接,看看它是否通过
实验
尝试不同的服务器或远程服务器(这么多费用 Cloud 在线托管)并测试相同的脚本..如果它工作,那么我猜测是真的一样好...
You need to update your system
其他代码相关
A. SSL
如果
Yii::app()->params['pdfUrl']
是https
不包含正确的SSL设置的网址也会导致旧版curl中出现此错误解决方案:确保已安装并启用OpenSSL,然后将其添加到您的代码中
我希望它有所帮助
通常,此错误表示已与服务器 Build 连接,但该连接已由远程服务器关闭 . 这可能是由于服务器速度慢,远程服务器出现问题,网络问题,或者(可能)某种安全错误,数据被发送到远程服务器,但我发现这不太可能 .
通常情况下,网络错误会在一段时间内自行解决,但听起来您已经花了一些时间 .
cURL有时会出现SSL和SSL证书问题 . 我认为您的Apache和/或PHP是使用最新版本的cURL和cURL SSL库编译的,我不认为您的Web服务器中安装了OpenSSL .
虽然我不能确定但是,我相信cURL在历史上一直是SSL证书,而Open SSL却没有 .
无论如何,尝试在服务器上安装Open SSL并再试一次,这应该可以帮助您摆脱这个错误 .
那么
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_url
和client_id
值(前者很可能包含需要转义的字符!)哦,如果没有先初始化它你就会追加到$body_str
.从您的详细输出中我们可以看到cURL正在添加
content-length
标头,但是......它是否正确?我可以在这个数字的互联网上看到一些错误的评论(特别是旧版本)...如果这个数字很小(例如)在发送所有数据之前,您将获得连接重置 . 您可以手动插入 Headers :哦,还有一个方便的函数http_build_query,它会将一组名称/值对转换为URL编码的字符串 .
所有这些都汇总到最终代码中:
这是一个防火墙问题,如果您使用的是VMware应用程序,请确保防病毒软件的防火墙已关闭或允许连接 .
如果此服务器位于安全网络上,请查看服务器的防火墙规则 .
谢谢Ganesh PNS
在我的情况下,URL中存在问题 . 我使用https://example.com - 但是他们确保'www.' - 所以当我切换到https://www.example.com时一切都还好 . 正确的 Headers 已发送'Host: www.example.com' .
您可以尝试在firefox brwoser中提出请求,坚持并复制为cURL - 我是如何找到它的 .
我遇到了同样的错误,但方式不同 .
使用特定SSL协议卷曲页面时 .
如果目标服务器不支持--sslv3,则错误将是
使用支持的协议,错误将消失 .