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

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

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.


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

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().


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.


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.


1

Spróbuj tego:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.