Я хочу проанализировать множество 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 невозможна из-за потери производительности.
Есть идеи?
Метод 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);
}
загнутый уголок nobody
вариант имеет использовать HEAD
HTTP-глагол, я бы поставил на большинство нестатических веб-приложений. Я дикий, не справляюсь с этим глаголом правильно, поэтому проблемы, которые вы видите с разными результатами. Я предлагаю сделать нормальный GET
запрос и отказ от ответа.
Я предлагаю get_headers()
вместо:
<?php
$url = 'http://www.example.com';
print_r(get_headers($url));
print_r(get_headers($url, 1));
?>