Intereting Posts
Как передать php-массив в локальный скрипт powershell Разбор данных JSON для Duplicatable Form для PHP для Mail Получить подстроку между двумя символами в javascript Файлы для загрузки Codeigniter Force Prestashop сохраняет счета-фактуры mannualy и автоматически pecl install cassandra throws: "error: Не удалось загрузить libcassandra" в OS X Формат цены в текущем регионе и валюте Сброс пространства имен в PHP? Zend_Session / Zend_Auth случайно генерирует сообщение об ошибке ps_files_cleanup_dir: opendir (/ var / lib / php5) не удалось: разрешение отклонено (13) Laravel 5 Middleware «Владелец»? Как создать древовидный вид из этого набора результатов на основе алгоритма обхода дерева? Symfony 2 Добавить токен CSRF при использовании формы без класса Как я могу изменить свой код для эхо-данных данных элемента child, где был найден мой поисковый запрос, в XMLReader? Не удается переопределить класс sfconfig Как передать параметры, которые вводят значение текстового поля в ajax в jquery

Получить http-statuscode без тела с помощью 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» -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)); ?>