Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CURL ERROR: Recv failure: Connection reset by peer - PHP Curl

Tags:

php

curl

yii

I'm having this strange error, CURL ERROR: Recv failure: Connection reset by peer

This is how it happens, if I did not connect to the server and all of a sudden trying to connect to the server via CURL in PHP I get the error. When I run the CURL script again the error disappears and then works well the whole time, if I leave the remote server idle for about 30mins or reboot the remote server and try to connect again, I get the error again. So it seems like the connection is idle and then all of sudden the server wakes up and then works and then sleeps again.

This is how my CURL script looks.

$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); 

I'm totally out of ideas and solutions, please help, I'll appreciate it!!!

If I verbose the output to see what happens using

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

I get the following

* 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 

I've added in the following toe remove the default header and still no luck:

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 
like image 644
Elitmiar Avatar asked Apr 23 '12 17:04

Elitmiar


1 Answers

Introduction

The remote server has sent you a RST packet, which indicates an immediate dropping of the connection, rather than the usual handshake.

Possible Causes

A. TCP/IP

It might be a TCP/IP issue you need to resolve with your host or upgrade your OS most times connection is closed with remote server before it finished downloading the content resulting in Connection reset by peer.....

B. Kernel Bug

Note that there are some issues with TCP window scaling on some Linux kernels after v2.6.17. See the following bug reports for more information:

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

You are using PHP/5.3.3 which has some serious bugs too ... I would advise you to work with a more recent version of PHP and 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

One common cause of this error is that the MTU (Maximum Transmission Unit) size of packets travelling over your network connection has been changed from the default of 1500 bytes. If you have configured a VPN this most likely must changed during configuration

D. Firewall: iptables

If you don't know your way around these guys they can cause some serious issues .. try and access the server you are connecting to check the following

  • You have access to port 80 on that server

Example

 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT` 
  • The Following is at the last line not before any other ACCEPT

Example

  -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited  
  • Check for ALL DROP, REJECT and make sure they are not blocking your connection

  • Temporary allow all connection as see if it foes through

Experiment

Try on a different server or on a remote server ( So many free cloud hosting online) and test the same script. If it works then my guesses are correct ... You need to update your system

Others Code Related

A. SSL

If Yii::app()->params['pdfUrl'] is a url with https not including proper SSL settings can also cause this error in old version of curl

Resolution: Make sure OpenSSL is installed and enabled then add this to your code

curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false); 
like image 159
Baba Avatar answered Oct 05 '22 12:10

Baba