PHP cURL HTTP CODE gibt 0 zurück

95

Ich verstehe nicht, wenn ich $ httpCode wiedergebe, bekomme ich immer 0, ich hatte 404 erwartet, als ich $ html_brand in eine kaputte URL verwandelte. Gibt es etwas, das ich vermisse oder von dem ich nichts weiß? Vielen Dank.

 //check if url exist
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $html_brand);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($httpCode == 404) {
    echo "The Web Page Cannot Be Found";
    return;
}
curl_close($ch);
Ardeus
quelle

Antworten:

95

Wenn Sie eine Verbindung mit dem Server herstellen, können Sie einen Rückkehrcode von diesem erhalten. Andernfalls schlägt dieser fehl und Sie erhalten eine 0. Wenn Sie also versuchen, eine Verbindung zu "www.google.com/lksdfk" herzustellen, erhalten Sie einen Rückkehrcode von 400, wenn Sie direkt zu google.com gehen, erhalten Sie 302 (und dann 200, wenn Sie zur nächsten Seite weiterleiten ... nun ja, weil es an google.com.br weiterleitet, sodass Sie das möglicherweise nicht erhalten). und wenn Sie zu "googlecom" gehen, erhalten Sie eine 0 (Host nicht gefunden). Bei der letzten gibt es also niemanden, der einen Code zurücksendet.

Getestet mit dem folgenden Code.

<?php

$html_brand = "www.google.com";
$ch = curl_init();

$options = array(
    CURLOPT_URL            => $html_brand,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
);
curl_setopt_array( $ch, $options );
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} \n"
        .curl_error($ch);
} else {
    echo "<pre>".htmlspecialchars($response)."</pre>";
}

curl_close($ch);
Schädel leer
quelle
1
Auch danke für die erneute Zuordnung, manchmal bekomme ich 301, was ein Umleitungsproblem ist.
Ardeus
Es ist seltsam, obwohl $ response HTML-Inhalt hat, aber der $ httpcode immer 0 zurückgibt, plus der curl_error ist null. Was möglich war, ging schief. Ich beziehe nur returntransfer, header (false) und followlocation in die Einstellung ein.
Ardeus
Nur um hinzuzufügen, wenn es vor oder nach der URL Leerzeichen gibt, wird auch der http_code = 0
Raja Amer Khan
80

Versuchen Sie dies nach curl_exec, um zu sehen, wo das Problem liegt:

print curl_error($ch);

Wenn es sich um etwas wie "fehlerhaft" handelt, überprüfen Sie Ihr URL-Format.

Hereblur
quelle
5
Danke für diesen Vorschlag - hat meinen Hintern gerettet :)
wbj
JA! Hat meinen Arsch gerettet.
Pimbrouwers
5

Überprüfen Sie den curl_error nach dem curl_getinfo, um die versteckten Fehler herauszufinden.

if(curl_errno($ch)){   
    echo 'Curl error: ' . curl_error($ch);
}
Daniel
quelle
2

Wie hier und unten erwähnt, gibt eine fehlgeschlagene Anforderung ( dh der Server wird nicht gefunden ) false zurück, keinen HTTP-Statuscode, da nie eine Antwort empfangen wurde.

Rufen Sie an curl_error().

CodeCaster
quelle
2

Ich hatte das gleiche Problem und in meinem Fall lag dies daran, dass die Funktion curl_exec in der php.ini deaktiviert ist. Auf Protokolle prüfen:

PHP Warning:  curl_exec() has been disabled for security reasons in /var/www/***/html/test.php on line 18

Die Lösung besteht darin, curl_exec aus den deaktivierten Funktionen in der php.ini in der Serverkonfigurationsdatei zu entfernen.

Gondy
quelle
1

Was ist der genaue Inhalt, den Sie an $ html_brand übergeben?

Wenn es eine ungültige URL-Syntax hat, erhalten Sie sehr wahrscheinlich den HTTP-Code 0.

psynnott
quelle
1

Versuche dies:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Meldo
quelle
2
Wenn Sie eine ältere Frage mit einer akzeptierten Antwort beantworten, ist es wichtig, darauf hinzuweisen, welchen neuen Aspekt der Frage Ihre Antwort anspricht. Auch Nur-Code-Antworten können im Allgemeinen verbessert werden, indem erklärt wird, wie und warum sie funktionieren. Auch wenn jemandem vorgeschlagen wird, die Sicherheit zu deaktivieren, ist es SEHR wichtig zu erklären, warum und welche Risiken bestehen.
Jason Aller
Während dieser Code die Frage beantworten kann, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum er das Problem löst, den langfristigen Wert der Antwort verbessern.
Donald Duck
0

Ein weiterer Grund für PHP, http-Code 0 zurückzugeben, ist das Timeout. In meinem Fall hatte ich die folgende Konfiguration:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

Es stellte sich heraus, dass die Anforderung an den Endpunkt, auf den ich zeigte, immer mehr als 500 ms dauerte, immer eine Zeitüberschreitung aufwies und immer den http-Code 0 zurückgab.

Wenn Sie diese Einstellung entfernen (CURLOPT_TIMEOUT_MS) oder einen höheren Wert eingeben (in meinem Fall 5000), erhalten Sie den tatsächlichen http-Code, in meinem Fall 200 (wie erwartet).

Siehe https://www.php.net/manual/en/function.curl-setopt.php

Alejandro Hdez. Angeles
quelle