PHP cURL HTTP CODE zwraca 0

97

Nie rozumiem, kiedy powtarzam $ httpCode. Zawsze otrzymuję 0, spodziewałem się 404, gdy zmieniam $ html_brand na uszkodzony adres URL. Czy jest coś, za czym tęsknię lub o czym nie wiem? Dzięki.

 //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
źródło

Odpowiedzi:

96

Jeśli połączysz się z serwerem, możesz uzyskać z niego kod powrotu, w przeciwnym razie nie powiedzie się i otrzymasz 0. Jeśli spróbujesz połączyć się z „www.google.com/lksdfk”, otrzymasz kod powrotu 400, jeśli przejdziesz bezpośrednio do google.com, otrzymasz 302 (a następnie 200, jeśli przekierujesz na następną stronę ... cóż, robię, ponieważ przekierowuje do google.com.br, więc możesz tego nie dostać), a jeśli przejdziesz do „googlecom”, otrzymasz 0 (nie znaleziono hosta), więc przy ostatnim nie ma nikogo, kto mógłby odesłać kod.

Przetestowano przy użyciu poniższego kodu.

<?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);
craniumonempty
źródło
1
Również dziękuję za ponowne ustalenie lokalizacji śledzącej, czasami otrzymuję 301, co jest problemem z przekierowaniem.
Ardeus
To dziwne, mimo że $ response ma zawartość html, ale $ httpcode zawsze zwraca 0, a curl_error ma wartość null. co mogło się nie udać. Uwzględniam tylko transfer zwrotny, nagłówek (fałsz), śledzenie lokalizacji tylko w ustawieniu.
Ardeus
Wystarczy dodać, że jeśli przed lub po adresie URL znajdują się spacje, spowoduje to również wyświetlenie http_code = 0
Raja Amer Khan
82

Spróbuj tego po curl_exec, aby zobaczyć, na czym polega problem:

print curl_error($ch);

Jeśli drukuje coś takiego jak „źle sformułowany”, sprawdź format adresu URL.

Hereblur
źródło
5
Dzięki za sugestię - uratowałam mój tyłek :)
wbj
TAK! Uratował mi tyłek.
pimbrouwers
5

sprawdź curl_error po curl_getinfo, aby znaleźć ukryte błędy.

if(curl_errno($ch)){   
    echo 'Curl error: ' . curl_error($ch);
}
Daniel
źródło
2

Jak powiedziano tutaj i poniżej, nieudane żądanie ( tj. Serwer nie został znaleziony ) zwraca fałsz, brak kodu statusu HTTP, ponieważ odpowiedź nigdy nie została odebrana.

Zadzwoń curl_error().

CodeCaster
źródło
2

Miałem ten sam problem iw moim przypadku było tak, ponieważ funkcja curl_exec jest wyłączona w php.ini. Sprawdź dzienniki:

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

Rozwiązaniem jest usunięcie curl_exec z wyłączonych funkcji w php.ini w pliku konfiguracyjnym serwera.

Gondy
źródło
1

Jaka jest dokładna treść, którą przekazujesz do $ html_brand?

Jeśli ma nieprawidłową składnię adresu URL, najprawdopodobniej otrzymasz kod HTTP 0.

psynnott
źródło
1

Spróbuj tego:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Meldo
źródło
3
Odpowiadając na starsze pytanie z zaakceptowaną odpowiedzią, ważne jest, aby wskazać, jakiego nowego aspektu pytania dotyczy twoja odpowiedź. Również odpowiedzi zawierające tylko kod można ogólnie ulepszyć, dodając wyjaśnienie, jak i dlaczego działają. Również sugerując, aby ktoś wyłączył zabezpieczenia, BARDZO ważne jest wyjaśnienie, dlaczego i jakie są zagrożenia.
Jason Aller
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Kaczor Donald
0

Innym powodem, dla którego PHP zwraca kod http 0, jest przekroczenie limitu czasu. W moim przypadku miałem następującą konfigurację:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

Okazało się, że żądanie do punktu końcowego, na który wskazywałem, zawsze trwało dłużej niż 500 ms, zawsze przekraczając limit czasu i zawsze zwracając kod http 0.

Jeśli usuniesz to ustawienie (CURLOPT_TIMEOUT_MS) lub ustawisz wyższą wartość (w moim przypadku 5000), otrzymasz rzeczywisty kod http, w moim przypadku 200 (zgodnie z oczekiwaniami).

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

Alejandro Hdez. Angeles
źródło
0

Jeśli używasz selinuksa, może to być spowodowane ograniczeniami bezpieczeństwa. Spróbuj ustawić to jako root:

# setsebool -P httpd_can_network_connect on
Samo
źródło