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

1voto

kumar ram Points 11

Nous avons rencontré le même problème en établissant une connexion websocket avec le Load Balancer. Le problème vient du fait que le LB accepte une connexion http sur le port 80 et transmet la requête au nœud (application tomcat sur le port 8080). Nous avons changé cela pour accepter une connexion tcp (http a été remplacé par 'tcp') sur le port 80. Ainsi, la première demande de poignée de main est transmise à Node et une connexion websocket est établie avec succès sur un port aléatoire (pour autant que je sache, cela peut être erroné).

La commande ci-dessous a été utilisée pour tester le processus de prise de contact avec Websocket.

curl -v -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: localhost" -H "Origin: http://LB URL:80" http://LB URL

  • Reconstruction de l'URL en : http:LB URL/

  • Essai de l'URL LB...

  • TCP_NODELAY set

  • Connexion à l'URL LB (URL LB) port 80 (#0)

    GET / HTTP/1.1 Hôte : localhost User-Agent : curl/7.60.0 Accepter : / Connexion : Mise à niveau Mise à jour : websocket Origine : http://LB URL:80

  • Échec de la récupération : Connexion réinitialisée par l'homologue

  • Connexion de fermeture 0 curl : (56) Recv failure : Connexion réinitialisée par l'homologue

0voto

Radek Points 168

Dans mon cas, il y avait un problème d'URL. J'ai utilisé https://example.com - mais ils garantissent "www.". - donc quand je suis passé à https://www.example.com tout allait bien. L'en-tête approprié a été envoyé 'Host : www.example.com'.

Vous pouvez essayer de faire une requête dans firefox brwoser, la persister et la copier en cURL - c'est ainsi que je l'ai trouvée.

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