2012-04-19 10 views
70

Nie rozumiem kiedy wysyłam echo $ httpCode Zawsze otrzymuję 0, spodziewałem się 404 kiedy zmienię $ html_brand w zepsuty URL. Czy jest coś, czego mi brakuje lub czego nie znam? Dzięki.PHP CURL HTTP CODE return 0

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

Odpowiedz

65

Jeśli łączysz się z serwerem, możesz uzyskać z niego kod powrotu, w przeciwnym razie zawiedzie, a otrzymasz 0. Jeśli więc 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 prześlesz do następnej strony ... cóż, zrobię to, ponieważ przekazuje dalej do google.com.br, więc możesz nie weź to), a jeśli przejdziesz do "googlecom", dostaniesz 0 (host nie zostanie znaleziony), więc przy ostatnim nie ma nikogo, kto by odesłał kod.

Testowane 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); 
+0

Również thx dla reflending followlocation też, czasami dostaję 301, który jest problemem przekierowującym. – Ardeus

+0

To dziwne, chociaż odpowiedź $ ma zawartość html, ale kod $ http zawsze zwraca 0, a curl_error ma wartość null. co mogło pójść nie tak. Dołączam tylko returntransfer, nagłówek (false), followlocation tylko w ustawieniu. – Ardeus

+0

bardzo przydatne! Dziękuję Ci bardzo. –

1

Jaka jest dokładna zawartość przesyłana do $ html_brand?

Jeśli to ma nieprawidłową składnię adresu URL, będzie najprawdopodobniej uzyskać kod HTTP 0.

1

Jak powiedział here i poniżej, nieudana prośba (czyli serwer nie zostanie znaleziony) zwraca false, nie Kod statusu HTTP, ponieważ odpowiedź nigdy nie została odebrana.

Zadzwoń pod curl_error().

54

Spróbuj tego po curl_exec aby zobaczyć, co jest problem:

print curl_error($ch); 

Jeśli jest coś takiego jak druk „niepoprawny”, a następnie sprawdzić format adresu URL.

+4

Dzięki za tę sugestię - uratowałem mój tyłek :) – wbj

+0

TAK! Uratowałem mój tyłek. – pimbrouwers

1

Miałem ten sam problem iw moim przypadku było to spowodowane wyłączeniem funkcji curl_exec w php.ini. Sprawdź logi:

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 na pliku konfiguracyjnym serwera.