web-dev-qa-db-fra.com

CURL ERROR: Echec de la reconnaissance: réinitialisation de la connexion par un homologue - PHP Boucle

J'ai cette étrange erreur, CURL ERROR: Echec Recv: connexion réinitialisée par un pair

Voici comment cela se produit, si je ne me connecte pas au serveur et que je tente tout à coup de me connecter au serveur via CURL dans PHP, j'obtiens l'erreur. Lorsque j'exécute à nouveau le script CURL, l'erreur disparaît et fonctionne correctement pendant tout le temps. Si je laisse le serveur distant inactif pendant environ 30 minutes ou si je redémarre le serveur distant et tente à nouveau de me connecter, l'erreur se reproduit. Il semble donc que la connexion est inactive et que tout à coup le serveur se réveille, puis fonctionne et se met à nouveau 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, aidez-moi, je l'apprécierai !!!

Si je commente la sortie pour voir ce qui se passe en utilisant 

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

Je reçois le suivant

* 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é dans l'orteil suivant supprimer l'en-tête par défaut et toujours pas de chance: 

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
56
Roland

introduction 

Le serveur distant vous a envoyé un paquet RST, qui indique une interruption immédiate de la connexion, plutôt que la prise de contact habituelle.

Causes possibles 

A. TCP/IP 

Il peut s'agir d'un problème TCP/IP que vous devez résoudre avec votre hôte ou mettre à niveau votre système d'exploitation. La plupart du temps, la connexion est fermée avant le serveur distant avant la fin du téléchargement du contenu résultant en Connection reset by peer..... 

B. Bug Kannel

Notez qu'il existe des problèmes avec la mise à l'échelle de la fenêtre TCP sur certains noyaux Linux après la v2.6.17. Consultez 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. PHP & CURL Bug 

Vous utilisez aussi PHP/5.3.3 qui a aussi quelques bugs sérieux ... Je vous conseillerais de travailler avec une version plus récente de PHP et 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 par défaut de 1 500 octets des paquets transitant par votre connexion réseau a été modifiée. Si vous avez configuré VPN, vous devrez probablement le modifier au cours de la configuration. 

D. Pare-feu: iptables 

Si vous ne connaissez pas bien ces gars-là, ils pourraient causer des problèmes sérieux. Essayez d’accéder au serveur auquel vous vous connectez pour vérifier les points 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`
  • Ce qui suit est à la dernière ligne pas avant tout autre ACCEPT 

Exemple

  -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-Host-prohibited 
  • Vérifiez ALL DROP, REJECT et assurez-vous qu’ils ne bloquent pas votre connexion.

  • Temporaire autoriser toutes les connexions comme voir si elle passe à travers 

Expérience 

Essayez un autre serveur ou un autre serveur distant (autant d’hébergements en ligne gratuits sur le cloud) et testez le même script. Si cela fonctionne, j’imagine qu’ils sont aussi vrais que vrais ... You need to update your system 

Autres codes liés 

A. SSL 

Si Yii::app()->params['pdfUrl'] est une URL avec https n'incluant pas un paramètre SSL approprié, vous pouvez également provoquer cette erreur dans l'ancienne version de curl 

Solution: assurez-vous qu'OpenSSL est installé et activé, puis ajoutez-le à votre code 

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

J'espère que ça aide 

89
Baba

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é avec l'envoi de données au serveur distant, mais je trouve cela peu probable. 

Normalement, une erreur de réseau se résoudra d'elle-même avec un peu de temps, mais il semblerait que vous en ayez déjà pris un peu.

cURL ayant 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 SSL cURL et cURL et que OpenSSL n’a pas été installé. votre serveur web.

Bien que je ne puisse pas en être certain, cURL a toujours été floué avec les certificats SSL, contrairement à Open SSL.

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

10
Aamer

Alors, quelle est l'URL que Yii::app()->params['pdfUrl'] donne? Vous dites que cela devrait être https, mais le journal indique qu'il se connecte sur le port 80 ... sur lequel presque aucun serveur n'est configuré pour accepter les connexions https. cURL est suffisamment intelligent pour savoir que https doit être sur le port 443 ... ce qui suggère que votre URL contient quelque chose de méchant, comme: https://196.41.139.168:80/serve/?r=pdf/generatePdf

Cela va entraîner la fin de la connexion, lorsque Apache à l'autre extrémité ne peut pas établir de communication https avec vous sur ce port.

Vous réalisez que votre première définition $body est remplacée lorsque vous définissez $body sur un tableau deux lignes plus tard? {Probablement juste un artefact de votre part essayant de résoudre le problème} Vous n'encodez pas non plus les valeurs client_url et client_id (le premier contenant probablement des caractères qui doivent être évités!) Oh, et vous ajoutez à $body_str sans l'initialiser au préalable.

De votre sortie commentée, nous pouvons voir que cURL ajoute un en-tête content-length, mais ... est-ce correct? Je peux voir quelques commentaires sur les internets indiquant que ce numéro est erroné (en particulier avec les anciennes versions) ... si ce nombre était trop petit (par exemple), vous obtiendrez 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 existe une fonction pratique http_build_query qui convertira un tableau de paires nom/valeur en une chaîne encodée par une URL pour vous.

Tout cela se résume 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);
3
Rudu

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 est sur un réseau sécurisé, veuillez consulter les règles de pare-feu du serveur.

Merci Ganesh PNS

1
GANESH

J'ai fait face à la même erreur mais d'une manière différente.

Lorsque vous courbez une page avec 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 

curl: (35) TCP connexion réinitialisée par un pair

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

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

Dans mon cas, il y avait un problème dans l'URL. J'ai utilisé https://example.com - mais ils assurent "www." - donc quand je suis passé sur 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 conserver et la copier en tant que cURL - voilà comment je l’ai trouvée.

0
Radek