it-swarm.com.de

CURL-FEHLER: Recv-Fehler: Verbindung von Peer zurückgesetzt PHP Curl

Ich habe diesen seltsamen Fehler, CURL-FEHLER: Recv-Fehler: Verbindung von Peer zurückgesetzt

Das passiert so, wenn ich mich nicht mit dem Server verbunden habe und plötzlich versucht habe, mich über CURL in PHP mit dem Server zu verbinden, bekomme ich den Fehler. Wenn ich das CURL-Skript erneut starte, verschwindet der Fehler und funktioniert dann die ganze Zeit gut. Wenn ich den Remote-Server für etwa 30 Minuten im Leerlauf lasse oder den Remote-Server neu starte und versuche, erneut eine Verbindung herzustellen, erhalte ich den Fehler erneut. Es sieht also so aus, als ob die Verbindung frei ist und dann plötzlich der Server aufwacht und dann funktioniert und dann wieder schläft.

So sieht mein CURL-Skript aus.

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

Ich bin total frei von Ideen und Lösungen, bitte helfen Sie, ich werde es zu schätzen wissen !!!

Wenn ich die Ausgabe verbose, um zu sehen, was passiert mit 

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

Ich bekomme folgendes

* 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

Ich habe in der folgenden Toe den Default-Header entfernt und trotzdem kein Glück: 

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

Einführung 

Der Remote-Server hat Ihnen ein RST-Paket gesendet, das ein sofortiges Trennen der Verbindung anstelle des üblichen Handshakes anzeigt.

Mögliche Ursachen 

A. TCP/IP 

Es kann ein TCP/IP-Problem sein, das Sie mit Ihrem Host lösen müssen oder Ihr Betriebssystem aktualisieren muss. Die Verbindung wird vor dem Remote-Server geschlossen, bevor der Download des Inhalts beendet ist, der zu Connection reset by peer..... 

B. Kannel Bug

Beachten Sie, dass bei einigen Linux-Kerneln nach Version 2.6.17 einige Probleme mit der TCP - Fensterskalierung auftreten. Weitere Informationen finden Sie in den folgenden Fehlerberichten:

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-Fehler 

Sie verwenden PHP/5.3.3, der auch einige schwerwiegende Fehler enthält ... Ich würde Ihnen raten, mit einer neueren Version von PHP und CURL zu arbeiten. 

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 

Eine häufige Ursache für diesen Fehler ist, dass die MTU-Größe (Maximum Transmission Unit) von Paketen, die über Ihre Netzwerkverbindung übertragen werden, gegenüber dem Standardwert von 1500 Byte geändert wurde. Wenn Sie VPN konfiguriert haben, muss dies höchstwahrscheinlich während der Konfiguration geändert werden 

D. Firewall: iptables 

Wenn Sie sich mit diesen Jungs nicht auskennen, würden sie einige ernsthafte Probleme verursachen. Versuchen Sie, auf den Server zuzugreifen, mit dem Sie sich verbinden, und prüfen Sie Folgendes

  • Sie haben Zugriff auf Port 80 auf diesem Server 

Beispiel

 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT`
  • Das Folgende ist in der letzten Zeile nicht vor einem anderen ACCEPT 

Beispiel

  -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-Host-prohibited 
  • Prüfen Sie auf ALLES TROPFEN, WIEDERHOLEN und stellen Sie sicher, dass die Verbindung nicht blockiert wird

  • Erlaube vorübergehend alle Verbindungen, um zu sehen, ob sie durchlaufen 

Experiment 

Versuchen Sie es mit einem anderen Server oder Remote-Server (so viele Gebühren für Cloud-Hosting online) und testen Sie dasselbe Skript. Wenn es funktioniert, schätze ich, dass es so gut wie wahr ist ... You need to update your system 

Andere Code-bezogene 

A. SSL 

Wenn Yii::app()->params['pdfUrl'] eine URL mit https ist, die keine korrekte SSL-Einstellung enthält, kann dieser Fehler auch in der alten Version von curl auftreten 

Lösung: Stellen Sie sicher, dass OpenSSL installiert und aktiviert ist, und fügen Sie dies Ihrem Code hinzu 

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

Ich hoffe, es hilft 

89
Baba

Normalerweise bedeutet dieser Fehler, dass eine Verbindung mit einem Server hergestellt wurde, diese Verbindung jedoch vom Remote-Server getrennt wurde. Dies kann auf einen langsamen Server, ein Problem mit dem Remote-Server, ein Netzwerkproblem oder (möglicherweise) einen Sicherheitsfehler beim Senden von Daten an den Remote-Server zurückzuführen sein. Ich finde das jedoch unwahrscheinlich. 

Normalerweise löst sich ein Netzwerkfehler nach einer gewissen Zeit auf, es klingt aber so, als hätten Sie ihn schon etwas Zeit.

cURL hat manchmal Probleme mit SSL- und SSL-Zertifikaten ... Ich glaube, Ihr Apache und/oder PHP wurde mit einer aktuellen Version der cURL- und cURL-SSL-Bibliotheken kompiliert. Außerdem glaube ich nicht, dass OpenSSL in installiert wurde Ihr Webserver.

Ich kann zwar nicht sicher sein, aber ich glaube, dass cURL historisch mit SSL-Zertifikaten beschwert wurde, Open SSL dagegen nicht.

Versuchen Sie auf jeden Fall, Open SSL auf dem Server zu installieren, und versuchen Sie es erneut. Das sollte Ihnen helfen, diesen Fehler zu beheben.

10
Aamer

Was ist also die URL, die Yii::app()->params['pdfUrl'] gibt? Sie sagen, es sollte https sein, aber das Protokoll zeigt an, dass die Verbindung an Port 80 hergestellt wird ... auf dem fast kein Server eingerichtet ist, um https-Verbindungen anzunehmen. cURL ist klug genug, um zu wissen, dass https auf Port 443 sein sollte ... was darauf hindeutet, dass Ihre URL etwas Ungewöhnliches enthält: https://196.41.139.168:80/serve/?r=pdf/generatePdf

Dies führt dazu, dass die Verbindung beendet wird, wenn der Apache am anderen Ende keine https-Kommunikation mit Ihnen an diesem Port durchführen kann.

Sie wissen, dass Ihre erste $body-Definition ersetzt wird, wenn Sie $body zwei Zeilen später auf ein Array setzen? {Sie sind wahrscheinlich nur ein Artefakt, bei dem Sie versuchen, das Problem zu lösen.} Sie codieren auch nicht die client_url- und client_id-Werte (die ersten enthalten möglicherweise Zeichen, die eine Escape-Aktion benötigen!) Oh, und Sie fügen an $body_str an, ohne sie zuerst zu initialisieren.

Aus Ihrer ausführlichen Ausgabe können Sie sehen, dass cURL einen content-length-Header hinzufügt, aber ... ist es richtig? Ich kann einige Kommentare zu den Internets dieser Nummer sehen, die falsch sind (insbesondere bei älteren Versionen) ... Wenn diese Anzahl zu klein wäre (zum Beispiel), würden Sie einen Verbindungs-Reset erhalten, bevor alle Daten gesendet werden. Sie können den Header manuell einfügen:

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

Und es gibt eine praktische Funktion http_build_query , die ein Array von Name/Wert-Paaren in eine URL-kodierte Zeichenfolge für Sie konvertiert.

All dies führt zum endgültigen Code:

$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

Dies ist ein Firewall-Problem. Wenn Sie eine VMware-Anwendung verwenden, stellen Sie sicher, dass die Firewall des Virenschutzprogramms deaktiviert ist oder Verbindungen zulässt.

Wenn sich dieser Server in einem sicheren Netzwerk befindet, werfen Sie einen Blick auf die Firewall-Regeln des Servers.

Danke Ganesh PNS

1
GANESH

Ich hatte denselben Fehler, aber auf andere Weise.

Wenn Sie eine Seite mit einem bestimmten SSL-Protokoll aufrollen.

curl --sslv3 https://example.com

Wenn --sslv3 nicht vom Zielserver unterstützt wird, liegt der Fehler vor 

curl: (35) TCP Verbindung von Peer zurückgesetzt

Mit dem unterstützten Protokoll ist der Fehler weg.

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

In meinem Fall gab es ein Problem mit der URL. Ich habe https://example.com verwendet - aber sie sorgen für 'www.' - Als ich dann zu https://www.example.com wechselte, war alles in Ordnung. Der richtige Header wurde mit "Host: www.example.com" gesendet.

Sie können versuchen, eine Anfrage in Firefox Browser zu machen, beharrlich zu machen und als cURL zu kopieren - so habe ich es gefunden.

0
Radek