Я хочу проанализировать множество 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» -option установлен в true, возвращенные коды состояния неверны (google.com возвращает 302, другие сайты возвращают 303).
Установка этого параметра в значение false невозможна из-за потери производительности.
Есть идеи?
По умолчанию метод HTTP-запроса для curl – это GET
. Если вы хотите только заголовки ответов, вы можете использовать метод HTTP HEAD
.
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'HEAD');
Согласно ответу Дай, NOBODY уже использует метод 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
нибыть cURL, он использует HEAD
HTTP-глагол, я бы поставил ставку на большинство нестатических веб-приложений. Я, дикий, не правильно обрабатываю этот глагол, следовательно, проблемы, которые вы видите с разными результатами. Я предлагаю сделать обычный GET
и отменить ответ.
Я предлагаю get_headers()
вместо:
<?php $url = 'http://www.example.com'; print_r(get_headers($url)); print_r(get_headers($url, 1)); ?>