Как проще всего использовать команду HEAD HTTP в PHP?

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

Вероятно, наиболее распространенным вариантом использования является проверка мертвых веб-ссылок. Для этого мне нужен только код ответа HTTP-запроса, а не содержимое страницы. Получение веб-страниц в PHP может быть легко выполнено с помощью file_get_contents("http://..."), но для проверки ссылок это действительно неэффективно, поскольку загружает все содержимое страницы/изображение/что угодно.


person fuenfundachtzig    schedule 09.10.2009    source источник


Ответы (5)


В качестве альтернативы curl вы можете использовать параметры контекста http, чтобы установить метод запроса на HEAD. Затем откройте поток (http-обертка) с этими параметрами и извлеките метаданные.

$context  = stream_context_create(array('http' =>array('method'=>'HEAD')));
$fd = fopen('http://php.net', 'rb', false, $context);
var_dump(stream_get_meta_data($fd));
fclose($fd);

см. также:
http://docs.php.net/stream_get_meta_data
http://docs.php.net/context.http

person VolkerK    schedule 09.10.2009
comment
Я предпочитаю это решение тем, которые используют curl, потому что мне нравится использовать встроенные функции. Может быть, кто-то еще может прокомментировать производительность каждой возможности? - person fuenfundachtzig; 23.10.2009
comment
Обратите внимание, что это вызовет ошибку для кодов ответа 401, в то время как curl предоставит вам фактический ответ. - person Fabian Schmengler; 14.12.2015
comment
stream_context_create() можно использовать также с file_get_contents(). Возможно, get_headers() гораздо лучше сочетается с stream_context_set_default() методом запроса к ‹code›HEAD‹/code›. См. php.net/manual/es/function.get-headers.php - person cybmeta; 03.02.2016

Вы можете аккуратно сделать это с помощью cURL:

<?php
// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");

// This changes the request method to HEAD
curl_setopt($ch, CURLOPT_NOBODY, true);

// grab URL and pass it to the browser
curl_exec($ch);

// Edit: Fetch the HTTP-code (cred: @GZipp)
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

// close cURL resource, and free up system resources
curl_close($ch);
person PatrikAkerstrand    schedule 09.10.2009

Еще проще, чем curl — просто используйте PHPget_headers()function, которая возвращает массив всей информации заголовка для любого указанного вами URL. И еще один очень простой способ проверить наличие удаленного файла — это usefopen()and попытаться открыть URL-адрес в режиме чтения (для этого вам нужно включить allow_url_fopen).

Просто ознакомьтесь с руководством по PHP для этих функций, там все есть.

person Brian    schedule 10.10.2009
comment
get_headers() на самом деле отправит запрос 'GET', если вы сначала не сделаете это: stream_context_set_default(array('http'=>array('method'=>'HEAD'))); - person Octopus; 01.06.2017

Вроде как у груши есть:

http://pear.php.net/manual/en/package.http.http.head.php

person JCasso    schedule 09.10.2009

Можно использовать Guzzle Client, он использует библиотеку CURL, но более простой и < сильно>оптимизировано.

установка:

composer require guzzlehttp/guzzle

пример в вашем случае:

// create guzzle object
$client = new \GuzzleHttp\Client();

// send request
$response = $client->head("https://example.com");

// extract headers from response
$headers = $response->getHeaders();

Быстро и легко.

Подробнее здесь

person Amin Shojaei    schedule 01.01.2020