PHP CURL HTTP CODE повернення 0


95

Я не розумію, коли я відлучую $ httpCode, я завжди отримую 0, я очікував 404, коли я зміню $ html_brand на зламану URL-адресу. Чи є щось, чого я сумую або не знаю? Дякую.

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

Відповіді:


95

Якщо ви підключитесь із сервером, ви можете отримати від нього код повернення, інакше він не вдасться, і ви отримаєте 0. Отже, якщо ви спробуєте підключитися до "www.google.com/lksdfk", ви отримаєте код повернення 400, якщо ви перейдете безпосередньо на google.com, ви отримаєте 302 (а потім 200, якщо перейдете на наступну сторінку ... ну я це роблю, тому що це пересилає на google.com.br, щоб ви цього не отримали), і якщо ви перейдете до "googlecom", ви отримаєте 0 (хост не знайдено), тож з останньою нікому не повернути код назад.

Перевірено з використанням коду нижче.

<?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
Крім того, THX для відмови від подальшого розміщення, іноді я отримую 301, що є проблемою переадресації.
Ардей

Це дивно, хоча $ response має вміст html, але $ httpcode завжди повертає 0, плюс помилка curl_erll є нульовою. те, що можливо, пішло не так. Я включаю лише returnntransfer, header (false), followlocation тільки в налаштуваннях.
Ардей

Додамо, якщо є якісь пробіли до або після URL-адреси, вона також кине http_code = 0
Раджа Амер Хан


80

Спробуйте це після curl_exec, щоб побачити, у чому проблема:

print curl_error($ch);

Якщо він друкує щось на кшталт "неправильне зображення", перевірте формат URL-адреси


5
Дякую за цю пропозицію - врятував мій недопалок :)
wbj

ТАК! Врятувало мою дупу.
pimbrouwers

5

перевірте curl_error після curl_getinfo, щоб виявити приховані помилки.

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

2

Як сказано тут і нижче, невдалий запит ( тобто сервер не знайдений ) повертає помилковий, не код статусу HTTP, оскільки відповіді ніколи не було отримано.

Телефонуйте curl_error().


2

У мене була така сама проблема, і в моєму випадку це було тому, що функція curl_exec відключена в php.ini. Перевірте наявність журналів:

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

Рішення полягає у видаленні curl_exec із відключених функцій у php.ini у файлі конфігурації сервера.


1

Який точний вміст ви передаєте в $ html_brand?

Якщо в ньому є недійсний синтаксис URL-адреси, ви, швидше за все, отримаєте код HTTP 0.


1

Спробуйте це:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

2
Відповідаючи на давнє запитання прийнятою відповіддю, важливо вказати, на який новий аспект запитання звертається ваша відповідь. Також відповіді на код тільки можна вдосконалити, додавши пояснення як і чому вони працюють. Також, коли пропонують, що хтось відключає безпеку, ДУЖЕ важливо пояснити, чому і які ризики є.
Джейсон Аллер

Хоча цей код може відповісти на запитання, надання додаткового контексту щодо того, як та / або чому він вирішує проблему, покращило б довгострокову цінність відповіді.
Дональд Дак

0

Ще одна причина PHP повертати http-код 0 - це таймаут. У моєму випадку у мене була така конфігурація:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

Виявилося, що запит на кінцеву точку, на яку я вказував, завжди займав більше 500 мс, завжди відмічаючи тайм-аут і завжди повертаючи http-код 0.

Якщо ви видалите це налаштування (CURLOPT_TIMEOUT_MS) або введете більш високе значення (у моєму випадку 5000), ви отримаєте фактичний http-код, у моєму випадку - 200 (як очікувалося).

Дивіться https://www.php.net/manual/en/function.curl-setopt.php

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.