Get headers: примеры (PHP)

Полное руководство по функции get_headers в PHP
Раздел: Сетевые функции
get_headers(string $url, int $associative = 0, ?resource $context = null): array|false
Функция get_headers в PHP

Функция get_headers() возвращает массив со всеми заголовками HTTP, которые сервер отправляет в ответ на запрос к указанному URL. Она часто применяется для предварительной проверки доступности ресурса, определения типа контента, проверки кеширования или получения метаинформации перед загрузкой основного содержимого.

Аргументы функции
  • url (string) - Обязательный параметр. Целевой URL-адрес.
  • associative (int) - Необязательный параметр. Если установлен в 1, функция возвращает ассоциативный массив. По умолчанию 0.
  • context (resource) - Необязательный параметр. Ресурс контекста потока, созданный с помощью функции stream_context_create(). Позволяет задать параметры HTTP-запроса.

Функция возвращает массив с заголовками или false в случае ошибки.

Базовые примеры использования get_headers
Простой запрос
<?
$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
    ...
)
Похожие функции в PHP
  • cURL (curl_init, curl_setopt, curl_exec) - Библиотека для сложных HTTP-запросов с поддержкой прокси, SSL, различных методов. Предпочтительнее для работы с API, обработки cookies или при необходимости тонкой настройки запроса.
  • fsockopen() - Низкоуровневая функция для открытия сетевого соединения. Требует ручного формирования HTTP-запроса и разбора ответа. Используется в специфических случаях, когда другие варианты не подходят.
  • get_meta_tags() - Извлекает только мета-теги из HTML-документа по URL. Не подходит для получения HTTP-заголовков.
  • apache_request_headers() / getallheaders() - Получают заголовки текущего входящего HTTP-запроса к скрипту, а не отправленного на внешний сервер.
Типичные ошибки
Игнорирование возвращаемого значения false
<?
$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
<?
// Ошибка: URL без протокола
$headers = get_headers('example.com');
var_dump($headers);
?>
bool(false)

URL должен начинаться с http:// или https://.

Таймаут при долгом ответе сервера
<?
// Если сервер долго не отвечает, скрипт будет ждать
// по умолчанию до момента таймаута.
$headers = get_headers('http://slow-server.com');
// Решение: использовать контекст потока с таймаутом.
?>
Изменения в последних версиях PHP
  • PHP 8.0.0: Параметр associative (ранее $format) теперь строго типизирован как int. Передача значения другого типа вызовет фатальную ошибку TypeError.
  • PHP 7.1.0: Добавлена поддержка контекста потока по умолчанию. Это означает, что можно установить опции по умолчанию для всех потоковых операций, включая get_headers, с помощью функции stream_context_set_default().
  • Более ранние версии: В PHP 5.1.3 добавлен необязательный параметр context.
Расширенные примеры использования
Проверка типа контента перед загрузкой
Пример php
<?
$url = 'https://example.com/file.pdf';
$headers = get_headers($url, 1);
if (strpos($headers['Content-Type'], 'application/pdf') !== false) {
    echo 'Это PDF-файл, можно начинать загрузку.';
} else {
    echo 'Тип контента не соответствует ожидаемому.';
}
?>
Обработка редиректов
Пример php
<?
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');
?>
Проверка доступности и времени ответа
Пример php
<?
$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 "Сервер не ответил.";
}
?>
Использование с прокси-сервером
Пример php
<?
$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);
?>
Извлечение только определенного заголовка
Пример php
<?
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');
?>
Альтернативы в других языках
Python (библиотека requests)
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 предоставляет более удобный и объектно-ориентированный интерфейс.

JavaScript (Node.js с модулем http/https или fetch API)
// Используя 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-запросов.

PHP get_headers function comments

En
Get headers Fetches all the headers sent by the server in response to an HTTP request