So beheben Sie den cURL-Fehler (7): Verbindung zum Host konnte nicht hergestellt werden?

70

Ich sende einen Artikelcode mit cUrl (php) an einen Webdienst im XML-Format. Ich bekomme die richtige Antwort in localhost, aber wenn es Server ist, wird es angezeigt

cURL-Fehler (7): Es konnte keine Verbindung zum Host hergestellt werden

Und hier ist mein Code:

function xml_post($post_xml, $url)
{
    $user_agent = $_SERVER['HTTP_USER_AGENT'];

    $ch = curl_init();    // initialize curl handle
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);          
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 50); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_xml); 
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
//  curl_setopt($ch, CURLOPT_PORT, $port);          

    $data = curl_exec($ch);
    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);
    if ($curl_errno > 0) {
            echo "cURL Error ($curl_errno): $curl_error\n";
    } else {
            echo "Data received\n";
    }
    curl_close($ch);

    echo $data;
}

Ich sende den Artikelcode an die Liste und hole die Details daraus. Ich habe versucht, beide Versionen PHP 4+ und PHP5 + zu verwenden, nichts funktioniert. Jede Lösung.

Raj
quelle
Wählen Sie einen Proxy, der einen Port 80 verwendet
Verwenden Sie Curl Verbose Option, um weitere Informationen zu erhalten
Preexo
Ich werde hier zwei Dinge hinzufügen, die mein Problem schließlich gelöst haben: 1. Führen Sie cURL über die Befehlszeile mit --verbose2. Wenn Sie mit Little Snitch (oder ähnlichem) unter OSX arbeiten, sehen Sie sich das an.
Stephen O'Flynn

Antworten:

49

CURL-Fehlercode 7 (CURLE_COULDNT_CONNECT)

ist sehr explizit ... es bedeutet Failed to connect() to host or proxy.

Der folgende Code würde auf jedem System funktionieren:

$ch = curl_init("http://google.com");    // initialize curl handle
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$data = curl_exec($ch);
print($data);

Wenn Sie Google-Seite nicht sehen können, dann .. your URL is wrongoder Sie haben einige firewalloder restrictionProbleme.

Baba
quelle
Ich kann die Google-Seite sehen. Aber dann die gleiche URL, die ich in localhost benutze und dort funktioniert es gut.
Raj
Es ist Ihre URL ... können Sie eine Beispiel-URL geben, die ich für Sie testen kann
Baba
1
Ich glaube nicht , dass eine öffentliche IP - Adresse verfügbar ist network-tools.com/... Pinging 122.165.82.61 mit 32 Bytes Daten: Zeitüberschreitung der Anforderung. Zeitüberschreitung der Anforderung. Zeitüberschreitung der Anforderung. Zeitüberschreitung der Anforderung.
Baba
4
@Baba Du hast gesagt: If you can not see google page then .. your URL is wrong or you have some firewall or restriction issue.Welche Einschränkungen können bestehen?
Hpaknia
1
@hpaknia danke, manchmal sehen wir das Offensichtliche nicht ... Als Ergänzung zu Ihrer Antwort sollten Sie in Linux-Systemen die ACL- und SELinux-Berechtigungen hinsichtlich des Zugriffs Ihres Webservices auf die ausgeführte Datei überprüfen.
Jorge_Freitas
24

Der Fehler "CURL ERROR 7 Fehler beim Herstellen einer Verbindung zu" Berechtigung verweigert "wird verursacht, wenn aus irgendeinem Grund die Curl-Anforderung durch eine Firewall oder ähnliches blockiert wird.

Sie werden mit diesem Problem konfrontiert sein, wenn die Curl-Anforderung nicht mit Standardports ausgeführt wird.

Wenn Sie sich beispielsweise zu einer URL auf Port 1234 locken, tritt dieses Problem auf, bei dem Sie als URL mit Port 80 problemlos Ergebnisse erzielen.

Am häufigsten wurde dieser Fehler unter CentOS und jedem anderen Betriebssystem mit 'SElinux' beobachtet.

Sie müssen 'SElinux' entweder deaktivieren oder in "Zulässig" ändern

Schau dir das an

http://www.akashif.co.uk/php/curl-error-7-failed-to-connect-to-permission-denied

Hoffe das hilft

Ali
quelle
3
Aber wie wäre es mit Mac-System
MeganZhou
7
Das Deaktivieren von SELinux ist übertrieben und wirkt sich negativ auf die Sicherheit in anderen Bereichen aus. Sie können andere als die bekannten Ports explizit zulassen, indem Sie diese spezielle Option im Terminal ändern: setsebool -P httpd_can_network_connect on
Matthew Erwin
Gibt es eine Liste von Standardports, für die Curl diesen Fehler nicht auslöst?
Michael Radionov
In meinem Fall hat der Server eine Liste der zulässigen Verbindungen und blockiert alle Verbindungen, die nicht in dieser Liste enthalten sind
jking
setsebool -P httpd_can_network_connect onhat bei mir nicht funktioniert (auf Centos 8 wurde versucht, fail2ban-Curling auf einen Webhook zu bringen, wenn Ban / Unbans ausgelöst werden). Müssen Sie dies in einem bestimmten aktuellen Verzeichnis aufrufen, oder wird dadurch der Selinux-Bool aus einem beliebigen Verzeichnis angewendet?
Bigp
6

Wenn Sie alle Möglichkeiten ausprobiert haben und fehlgeschlagen sind, versuchen Sie diesen einen Befehl:

setsebool -P httpd_can_network_connect on
Iman Marashi
quelle
4

In meinem Fall hatte ich so etwas cURL Error (7): ... Operation Timed Out . Ich verwende die Netzwerkverbindung des Unternehmens, für das ich arbeite. Ich musste einige Umgebungsvariablen erstellen. Der nächste hat bei mir funktioniert:

Im Linux-Terminal:

$ export https_proxy=yourProxy:80
$ export http_proxy=yourProxy:80  

In Windows habe ich (die gleichen) Umgebungsvariablen auf Windows-Weise erstellt.

Ich hoffe, es hilft!

Grüße!

Idealdo Félix
quelle
Ist yourproxy - 127.0.0.1
Flyn Sequeira
4

In PHP, wenn Ihr Netzwerk unter Proxy. Sie sollten die Proxy-URL und den Port festlegen

curl_setopt($ch, CURLOPT_PROXY, "http://url.com"); //your proxy url
curl_setopt($ch, CURLOPT_PROXYPORT, "80"); // your proxy port number

Dies löst mein Problem

Prinz Jose
quelle
2

Können Sie diese URL per Browser oder PHP-Skript aufrufen? Der angezeigte Fehler ist, dass Sie keine Verbindung herstellen konnten. Stellen Sie also zunächst sicher, dass auf die URL zugegriffen werden kann.

Mohan Shanmugam
quelle
3
Ja. Von localhost kann ich darauf zugreifen. Ich habe es im Browser gepingt, es pingt.
Raj
1

Überprüfen Sie, ob die Ports 80 und 443 blockiert sind. oder geben Sie - IP graph.facebook.com ein und geben Sie es in die Datei etc / hosts ein

Weißes Pferd
quelle
1

Sie können dies auch erhalten, wenn Sie versuchen, dieselbe URL mit mehreren HTTP-Anforderungen gleichzeitig zu treffen. Viele Curl-Anforderungen können keine Verbindung herstellen und kehren daher mit einem Fehler zurück

dv3
quelle
1

Dieses Problem kann auch durch Curl-Aufrufe von https verursacht werden, wenn es nicht auf dem Remote-Gerät konfiguriert ist. Ein Aufruf über http kann dieses Problem in diesen Situationen beheben, zumindest bis Sie ssl auf der Fernbedienung konfigurieren.

Scott T Rogers
quelle
1

In meinem Fall wurde das Problem durch den Hosting-Anbieter verursacht, den ich verwendet habe, um http-Pakete zu blockieren, die an ihren IP-Block adressiert sind und aus ihrem IP-Block stammen. Unglaublich glaubwürdig !!!

Jeff
quelle