PHP cURL HTTP CODE возвращает 0


97

Я не понимаю, когда я повторяю $ 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);

Ответы:


96

Если вы подключаетесь к серверу, вы можете получить от него код возврата, в противном случае произойдет сбой, и вы получите 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
Также спасибо за повторное размещение подписки, иногда я получаю 301, что является проблемой перенаправления.
Ardeus

Это странно, хотя $ response имеет html-контент, но $ httpcode всегда возвращает 0, плюс curl_error имеет значение null. что могло пойти не так. В настройках я включаю только returnntransfer, header (false), followlocation.
Ardeus

Просто чтобы добавить, если есть какие-либо пробелы до или после URL-адреса, он также выдаст http_code = 0
Raja Amer Khan


82

Попробуйте это после curl_exec, чтобы узнать, в чем проблема:

print curl_error($ch);

Если он напечатал что-то вроде «искаженного», проверьте формат URL-адреса.


5
Спасибо за это предложение - спасла мою задницу :)
wbj

ДА! Спас мою задницу.
pim


2

Как сказано здесь и ниже, неудавшийся запрос ( т.е. сервер не найден ) возвращает false, код статуса 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);

3
Отвечая на старый вопрос принятым ответом, важно указать, к какому новому аспекту вопроса относится ваш ответ. Также ответы, содержащие только код, обычно можно улучшить, добавив объяснения того, как и почему они работают. Также, предлагая кому-то отключить систему безопасности, ОЧЕНЬ важно объяснить, почему и каковы риски.
Джейсон Аллер,

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

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


0

Если вы используете selinux, это может быть связано с ограничениями безопасности. Попробуйте установить это как root:

# setsebool -P httpd_can_network_connect on
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.