Get headers: примеры (PHP)
get_headers(string $url, int $associative = 0, ?resource $context = null): array|falseФункция get_headers() возвращает массив со всеми заголовками HTTP, которые сервер отправляет в ответ на запрос к указанному URL. Она часто применяется для предварительной проверки доступности ресурса, определения типа контента, проверки кеширования или получения метаинформации перед загрузкой основного содержимого.
- url (string) - Обязательный параметр. Целевой URL-адрес.
- associative (int) - Необязательный параметр. Если установлен в 1, функция возвращает ассоциативный массив. По умолчанию 0.
- context (resource) - Необязательный параметр. Ресурс контекста потока, созданный с помощью функции
stream_context_create(). Позволяет задать параметры HTTP-запроса.
Функция возвращает массив с заголовками или false в случае ошибки.
<?
$url = 'https://example.com';
$headers = get_headers($url);
print_r($headers);
?>Array
(
[0] => HTTP/1.1 200 OK
[1] => Server: nginx
[2] => Content-Type: text/html; charset=UTF-8
...
)<?
$url = 'https://api.example.com/data.json';
$headers = get_headers($url, 1);
print_r($headers);
?>Array
(
[0] => HTTP/1.1 200 OK
[Server] => nginx
[Content-Type] => application/json
[Content-Length] => 1234
)<?
$context = stream_context_create([
'http' => [
'method' => 'HEAD',
'header' => 'User-Agent: MyCustomBot/1.0'
]
]);
$headers = get_headers('https://example.com', 0, $context);
print_r($headers);
?>Array
(
[0] => HTTP/1.1 200 OK
[1] => Server: nginx
...
)- cURL (curl_init, curl_setopt, curl_exec) - Библиотека для сложных HTTP-запросов с поддержкой прокси, SSL, различных методов. Предпочтительнее для работы с API, обработки cookies или при необходимости тонкой настройки запроса.
- fsockopen() - Низкоуровневая функция для открытия сетевого соединения. Требует ручного формирования HTTP-запроса и разбора ответа. Используется в специфических случаях, когда другие варианты не подходят.
- get_meta_tags() - Извлекает только мета-теги из HTML-документа по URL. Не подходит для получения HTTP-заголовков.
- apache_request_headers() / getallheaders() - Получают заголовки текущего входящего HTTP-запроса к скрипту, а не отправленного на внешний сервер.
<?
$headers = get_headers('http://несуществующий-сайт.xyz');
// Если запрос не удался, $headers будет false
// Ошибка: попытка работать с false как с массивом
foreach($headers as $header) { // Warning: Invalid argument supplied for foreach()
echo $header;
}
?>PHP Warning: Invalid argument supplied for foreach()
Следует всегда проверять, что функция вернула массив.
<?
// Ошибка: URL без протокола
$headers = get_headers('example.com');
var_dump($headers);
?>bool(false)
URL должен начинаться с http:// или https://.
<?
// Если сервер долго не отвечает, скрипт будет ждать
// по умолчанию до момента таймаута.
$headers = get_headers('http://slow-server.com');
// Решение: использовать контекст потока с таймаутом.
?>- PHP 8.0.0: Параметр
associative(ранее$format) теперь строго типизирован какint. Передача значения другого типа вызовет фатальную ошибку TypeError. - PHP 7.1.0: Добавлена поддержка контекста потока по умолчанию. Это означает, что можно установить опции по умолчанию для всех потоковых операций, включая get_headers, с помощью функции
stream_context_set_default(). - Более ранние версии: В PHP 5.1.3 добавлен необязательный параметр
context.
<?
$url = 'https://example.com/file.pdf';
$headers = get_headers($url, 1);
if (strpos($headers['Content-Type'], 'application/pdf') !== false) {
echo 'Это PDF-файл, можно начинать загрузку.';
} else {
echo 'Тип контента не соответствует ожидаемому.';
}
?><?
function get_final_url($url) {
$headers = get_headers($url, 1);
if ($headers && strpos($headers[0], '301') !== false || strpos($headers[0], '302') !== false) {
if (isset($headers['Location'])) {
// Location может быть массивом при нескольких редиректах
$location = is_array($headers['Location']) ? end($headers['Location']) : $headers['Location'];
return get_final_url($location);
}
}
return $url;
}
echo get_final_url('http://old-site.com');
?><?
$start = microtime(true);
$headers = @get_headers('https://example.com');
$time = microtime(true) - $start;
if ($headers) {
$code = substr($headers[0], 9, 3); // Получаем HTTP-код
echo "Сервер ответил с кодом {$code} за {$time} секунд.";
} else {
echo "Сервер не ответил.";
}
?><?
$context = stream_context_create([
'http' => [
'proxy' => 'tcp://proxy.example.com:3128',
'request_fulluri' => true,
'timeout' => 10,
],
]);
$headers = get_headers('http://external-site.com', 0, $context);
?><?
function get_single_header($url, $header_name) {
$headers = get_headers($url, 1);
if ($headers && isset($headers[$header_name])) {
return $headers[$header_name];
}
return null;
}
echo "Время последнего изменения: " . get_single_header('https://example.com', 'Last-Modified');
?>import requests
response = requests.head('https://example.com')
print(response.headers)
# Или для GET запроса только с заголовками:
# response = requests.get('https://example.com', stream=True)
# print(response.headers){'Server': 'nginx', 'Content-Type': 'text/html', ...}Библиотека requests предоставляет более удобный и объектно-ориентированный интерфейс.
// Используя fetch (браузер или Node.js с полифилом)
fetch('https://example.com', { method: 'HEAD' })
.then(response => {
console.log(Array.from(response.headers.entries()));
});
// Используя модуль https в Node.js
const https = require('https');
const req = https.request('https://example.com', { method: 'HEAD' }, (res) => {
console.log(res.headers);
});
req.end();JavaScript работает асинхронно, что является ключевым отличием от синхронного get_headers() в PHP.
Get headers в MySQL
Прямых аналогов в MySQL нет, так как это язык запросов к базе данных, а не для сетевых HTTP-запросов.