85 votes

CURL ERROR : Recv failure : Connexion réinitialisée par un pair - PHP Curl

J'ai cette étrange erreur, CURL ERROR : Recv failure : Connexion réinitialisée par l'homologue

Voici comment cela se passe, si je ne me suis pas connecté au serveur et que j'essaie soudainement de me connecter au serveur via CURL en PHP, j'obtiens l'erreur. Lorsque j'exécute à nouveau le script CURL script, l'erreur disparaît et fonctionne correctement tout le temps. Si je laisse le serveur distant inactif pendant environ 30 minutes ou si je redémarre le serveur distant et que j'essaie de me connecter à nouveau, j'obtiens à nouveau l'erreur. Il semble donc que la connexion soit inactive et que tout d'un coup le serveur se réveille, puis fonctionne, puis se remet en veille.

Voici à quoi ressemble mon script 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);

Je suis totalement à court d'idées et de solutions, merci de m'aider, je vous en serais reconnaissant ! !!

Si j'analyse la sortie pour voir ce qui se passe en utilisant

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

J'obtiens ce qui suit

* 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

J'ai ajouté ce qui suit pour supprimer l'en-tête par défaut, mais je n'ai toujours pas réussi :

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

121voto

Baba Points 49157

Introduction

Le serveur distant vous a envoyé un paquet RST, qui indique une interruption immédiate de la connexion, au lieu de la poignée de main habituelle.

Causes possibles

A. TCP/IP

Il peut s'agir d'un problème TCP/IP que vous devez résoudre avec votre hébergeur ou mettre à jour votre système d'exploitation. La plupart du temps, la connexion est fermée avec le serveur distant avant qu'il n'ait fini de télécharger le contenu, ce qui se traduit par Connection reset by peer .....

B. Bug du noyau

Notez qu'il y a des problèmes avec la mise à l'échelle des fenêtres TCP sur certains noyaux Linux après la version 2.6.17. Voir les rapports de bogues suivants pour plus d'informations :

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. Bug PHP & CURL

Vous utilisez PHP/5.3.3 qui a aussi de sérieux bugs ... Je vous conseille de travailler avec une version plus récente de PHP y 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. Unité de transmission maximale

Une cause fréquente de cette erreur est que la taille MTU (Maximum Transmission Unit) des paquets circulant sur votre connexion réseau a été modifiée par rapport à la valeur par défaut de 1500 octets. Si vous avez configuré un VPN Ceci doit probablement être modifié lors de la configuration

D. Pare-feu : iptables

Si vous ne savez pas vous y prendre avec eux, ils peuvent causer de sérieux problèmes Essayez d'accéder au serveur auquel vous vous connectez et vérifiez les éléments suivants

  • Vous avez accès au port 80 sur ce serveur

Exemple

 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT`
  • La ligne suivante se trouve à la dernière ligne et non avant toute autre ligne ACCEPTER

Exemple

  -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited 
  • Vérifier que ALL DROP, REJECT et qu'ils ne bloquent pas votre connexion.

  • Autoriser temporairement toutes les connexions pour voir si elles passent.

Expérience

Essayez sur un autre serveur ou sur un serveur distant (il y a tant d'hébergements gratuits en ligne) et testez le même script. Si cela fonctionne, alors mes suppositions sont correctes... You need to update your system

Autres codes liés

A. SSL

Si Yii::app()->params['pdfUrl'] est une url avec https le fait de ne pas inclure les paramètres SSL appropriés peut également provoquer cette erreur dans les anciennes versions de curl

Résolution : Assurez-vous que OpenSSL est installé et activé, puis ajoutez ceci à votre code

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

18voto

Aamer Alduais Points 607

Normalement, cette erreur signifie qu'une connexion a été établie avec un serveur mais que cette connexion a été fermée par le serveur distant. Cela peut être dû à un serveur lent, à un problème avec le serveur distant, à un problème de réseau ou (peut-être) à une sorte d'erreur de sécurité concernant les données envoyées au serveur distant, mais cela me semble peu probable.

Normalement, une erreur de réseau se résout d'elle-même après un certain temps, mais il semble que vous l'ayez déjà fait.

cURL a parfois des problèmes avec SSL et les certificats SSL. Je pense que votre Apache et/ou PHP a été compilé avec une version récente des bibliothèques cURL et cURL SSL et je ne pense pas qu'OpenSSL ait été installé sur votre serveur web.

Bien que je n'en sois pas certain, je crois que cURL a toujours eu des problèmes avec les certificats SSL, alors qu'Open SSL n'en a pas.

Quoi qu'il en soit, essayez d'installer Open SSL sur le serveur et réessayez, cela devrait vous aider à vous débarrasser de cette erreur.

4voto

Rudu Points 8641

Quelle est donc l'URL que Yii::app()->params['pdfUrl'] donne ? Vous dites qu'il devrait être https, mais le journal montre qu'il se connecte sur le port 80... sur lequel presque aucun serveur n'est configuré pour accepter des connexions https. cURL est assez intelligent pour savoir que https devrait être sur le port 443... ce qui suggérerait que votre URL a quelque chose de bizarre dans elle comme : https://196.41.139.168:80/serve/?r=pdf/generatePdf

La connexion sera alors interrompue, car l'Apache à l'autre bout ne peut pas communiquer en https avec vous sur ce port.

Vous réalisez que votre première $body est remplacée lorsque vous définissez $body dans un tableau deux lignes plus loin ? {Probablement juste un artefact de votre tentative de résoudre le problème} Vous n'encodez pas non plus l'élément client_url y client_id (la première pouvant contenir des caractères qui doivent être échappés !) Oh et vous ajoutez à $body_str sans l'initialiser au préalable.

D'après votre sortie verbale, nous pouvons voir que cURL ajoute un élément content-length mais... est-ce que c'est correct ? Je vois des commentaires sur les internets concernant ce nombre qui est erroné (surtout avec les anciennes versions)... si ce nombre était trop petit (par exemple), vous obtiendriez une réinitialisation de la connexion avant que toutes les données ne soient envoyées. Vous pouvez insérer manuellement l'en-tête :

curl_setopt ($c, CURLOPT_HTTPHEADER, 
   array("Content-Length: ". strlen($body_str))); 

Oh, et il y a une fonction pratique http_build_query qui convertira un tableau de paires nom/valeur en une chaîne codée en URL.

Tout cela se retrouve dans le code final :

$post=http_build_query(array(
  "client_url"=>Yii::app()->params['pdfClientURL'],
  "client_id"=>Yii::app()->params['pdfClientID'],
  "title"=>$title,
  "content"=>$content));

//Open to URL
$c=curl_init(Yii::app()->params['pdfUrl']);
//Send post
curl_setopt ($c, CURLOPT_POST, true);
//Optional: [try with/without]
curl_setopt ($c, CURLOPT_HTTPHEADER, array("Content-Length: ".strlen($post))); 
curl_setopt ($c, CURLOPT_POSTFIELDS, $post);
curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
curl_setopt ($c, CURLOPT_TIMEOUT  , 20);
//Collect result
$pdf = curl_exec ($c);
$curlInfo = curl_getinfo($c);
curl_close($c);

4voto

xs2rashid Points 355

J'ai rencontré la même erreur, mais d'une manière différente.

Lorsque vous curlisez une page à l'aide d'un protocole SSL spécifique.

curl --sslv3 https://example.com

Si --sslv3 n'est pas pris en charge par le serveur cible, l'erreur sera la suivante

curl : (35) Connexion TCP réinitialisée par l'homologue

Avec le protocole pris en charge, l'erreur disparaît.

curl --tlsv1.2 https://example.com

2voto

GANESH Points 51

Il s'agit d'un problème de pare-feu. Si vous utilisez une application VMware, assurez-vous que le pare-feu de l'antivirus est désactivé ou qu'il autorise les connexions.

Si ce serveur se trouve sur un réseau sécurisé, veuillez consulter les règles du pare-feu du serveur.

Remerciements Ganesh PNS

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X