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);
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.
źródło
sprawdź curl_error po curl_getinfo, aby znaleźć ukryte błędy.
if(curl_errno($ch)){ echo 'Curl error: ' . curl_error($ch); }
źródło
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()
.źródło
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.
źródło
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.
źródło
Spróbuj tego:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
źródło
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
źródło
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
źródło