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
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.
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:
Exemple
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j 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
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
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
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.
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);
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
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
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.