Получить http-статус-код без тела, используя cURL?

Я хочу проанализировать множество URL-адресов, чтобы получить только их коды состояния.

Итак, что я сделал, это:

$handle = curl_init($url -> loc);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_HEADER  , true);  // we want headers
curl_setopt($handle, CURLOPT_NOBODY  , true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
curl_close($handle);

Но как только для параметра «nobody» установлено значение «истина», возвращаемые коды состояния становятся неверными (google.com возвращает 302, другие сайты возвращают 303).

Установка этой опции в false невозможна из-за потери производительности.

Есть идеи?

1

Решение

Метод HTTP-запроса по умолчанию для curl: GET, Если вы хотите только заголовки ответа, вы можете использовать метод HTTP HEAD,

curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'HEAD');

Согласно ответу @ Dai, НИКТО уже использует метод HEAD. Таким образом, вышеуказанный метод не будет работать.

Другой вариант будет использовать fsockopen чтобы открыть соединение, напишите заголовки, используя fwrite, Прочитайте ответ, используя fgets до первого появления \r\n\r\n чтобы получить полный заголовок. Поскольку вам нужен только код состояния, вам просто нужно прочитать первые 13 символов.

<?php
$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
if ($fp) {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.google.com\r\n";
$out .= "Accept-Encoding: gzip, deflate, sdch\r\n";
$out .= "Accept-Language: en-GB,en-US;q=0.8,en;q=0.6\r\n";
$out .= "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36\r\n";
$out .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$tmp = explode(' ', fgets($fp, 13));
echo $tmp[1];
fclose($fp);
}
2

Другие решения

загнутый уголок nobody вариант имеет использовать HEAD HTTP-глагол, я бы поставил на большинство нестатических веб-приложений. Я дикий, не справляюсь с этим глаголом правильно, поэтому проблемы, которые вы видите с разными результатами. Я предлагаю сделать нормальный GET запрос и отказ от ответа.

1

Я предлагаю get_headers() вместо:

<?php
$url = 'http://www.example.com';

print_r(get_headers($url));

print_r(get_headers($url, 1));
?>
0