Получение HTML страницы через PHP: инструкции и примеры

Раздел: PHP -> Работа с файлами

Основные способы получения HTML содержимого через PHP

Как загрузить HTML файл с удалённого сервера с минимальным количеством кода?

Наиболее эффективное и простое решение для получения HTML содержимого из сети или локального файла - использование функции file_get_contents. Она читает файл в строку, поддерживает протоколы HTTP, HTTPS, FTP и другие, если опция allow_url_fopen включена в настройках PHP. Для управления HTTP-запросами (заголовки, таймауты, метод POST) применяется вспомогательная функция stream_context_create.


$url = 'https://example.com/page.html';
$options = [
  'http' => [
    'method' => 'GET',
    'header' => "User-Agent: MyPHPApp/1.0\r\n" .
                "Accept: text/html\r\n",
    'timeout' => 15
  ]
];
$context = stream_context_create($options);
$html = @file_get_contents($url, false, $context);
if ($html === false) {
  $error = error_get_last();
  echo 'Ошибка получения HTML: ' . ($error['message'] ?? 'неизвестная');
} else {
  echo 'HTML загружен, длина: ' . strlen($html);
}
  

Include system php (включение системного файла)

Ключевые моменты:

  • Флаг @ подавляет предупреждения - их нужно обрабатывать через error_get_last.
  • В массиве http задаются параметры протокола: метод, заголовки, таймаут.
  • При false результата следует проверить, нет ли ошибок подключения, блокировки URL, проблем с SSL.

Как загрузить HTML, если allow_url_fopen отключён или нужен более тонкий контроль?

Когда функция file_get_contents не может работать с удалёнными адресами, на помощь приходит библиотека cURL. Она доступна в большинстве инсталляций PHP и позволяет гибко настраивать запросы, обрабатывать cookie, редиректы, SSL-сертификаты.


$url = 'https://example.com/page.html';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_USERAGENT, 'MyPHPApp/1.0');
$html = curl_exec($ch);
if (curl_errno($ch)) {
  echo 'cURL ошибка: ' . curl_error($ch);
} else {
  echo 'HTML получен, код ответа: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE);
}
curl_close($ch);
  

Ru reading php line (чтение строки из файла php)

cURL даёт возможность отслеживать HTTP-статус, загружать только заголовки, работать с прокси, отправлять POST-данные. Это универсальное решение для любых сценариев загрузки.

Как получить HTML файл частями, не загружая его целиком в память?

Для больших HTML документов экономичнее использовать потоковое чтение через fopen + stream_get_contents. Функция fopen открывает поток, а stream_get_contents считывает его по частям. Указав лимит, можно загрузить только начало страницы.


$url = 'https://example.com/large.html';
$handle = fopen($url, 'r');
if ($handle) {
  $partial = stream_get_contents($handle, 4096); // первые 4 КБ
  fclose($handle);
  echo 'Загружено ' . strlen($partial) . ' байт'; 
} else {
  echo 'Не удалось открыть поток';
}
  

Php file get html (получение html файла через php)

Такой подход полезен для парсинга или анализа заголовков без полной загрузки.

Как загрузить HTML с авторизацией (Basic Auth) или с использованием API-ключей?

Через контекст потока можно добавить заголовок Authorization. Пример с базовой аутентификацией:


$url = 'https://private.example.com/page.html';
$login = 'user';
$password = 'pass';
$options = [
  'http' => [
    'header' => "Authorization: Basic " . base64_encode("$login:$password") . "\r\n"
  ]
];
$context = stream_context_create($options);
$html = file_get_contents($url, false, $context);
  

Для более сложных сценариев (OAuth, Bearer-токены) достаточно заменить заголовок.

Какие типичные проблемы возникают при получении HTML и как их решить?

  • Ошибка allow_url_fopen = 0 - используйте cURL или обратитесь к хостингу для включения директивы.
  • SSL-сертификат - при ошибках сертификата добавьте в cURL CURLOPT_SSL_VERIFYPEER = false (не рекомендуется для продакшена) или укажите путь к CA-пакету.
  • Таймауты - увеличьте значение параметра timeout в контексте или cURL.
  • Кодировка ответа - проверьте заголовок Content-Type; для UTF-8 используйте mb_convert_encoding при необходимости.
  • Редиректы - в cURL включите CURLOPT_FOLLOWLOCATION; в контексте потоков редиректы обрабатываются автоматически, если сервер отвечает корректно.
  • Блокировка по IP - добавьте заголовок User-Agent, имитирующий браузер.
- Edit home php (редактирование файла home.php)
- Php количество файлов (подсчет количества файлов в папке в php)
- Archive php file (php: работа с архивными файлами (zip, tar))

Расширенные примеры получения HTML в PHP

Пример 1: Загрузка HTML с установкой нескольких заголовков и таймаута через контекст

Пример

$url = 'https://httpbin.org/html';
$context = stream_context_create([
  'http' => [
    'method' => 'GET',
    'header' => implode("\r\n", [
      'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
      'Accept-Language: ru-RU,ru;q=0.9',
      'Cache-Control: no-cache'
    ]),
    'timeout' => 10
  ]
]);
$html = @file_get_contents($url, false, $context);
if ($html === false) {
  echo 'Ошибка: ' . error_get_last()['message'];
} else {
  echo 'Успешно. Размер: ' . strlen($html) . ' символов.';
}
Успешно. Размер: 3742 символов.

Пояснение: массив заголовков объединяется через implode с разделителем CRLF. Таймаут в секундах задаётся в опции timeout.

Пример 2: Загрузка HTML с POST-данными через cURL

Пример

$url = 'https://example.com/form-handler.php';
$postData = http_build_query(['name' => 'Иван', 'age' => 30]);
$ch = curl_init($url);
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => $postData,
  CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'],
  CURLOPT_TIMEOUT => 15
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP-код: $httpCode\n";
echo "HTML ответа: " . (mb_strlen($response) > 200 ? mb_substr($response, 0, 200) . '...' : $response);
HTTP-код: 200
HTML ответа: <!DOCTYPE html>... 

Пояснение: http_build_query преобразует массив в строку параметров. cURL выполняет POST-запрос, ответ содержит результирующую HTML-страницу.

Пример 3: Загрузка HTML с обработкой редиректов и проверкой кода состояния (cURL)

Пример

$url = 'http://httpbin.org/redirect/2'; // два редиректа
$ch = curl_init($url);
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_MAXREDIRS => 5,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HEADERFUNCTION => function($curl, $headerLine) {
    // можно логировать заголовки
    static $log = [];
    $log[] = trim($headerLine);
    return strlen($headerLine);
  }
]);
$html = curl_exec($ch);
$info = curl_getinfo($ch);
if ($html === false) {
  echo 'cURL error: ' . curl_error($ch);
} else {
  echo 'Конечный URL: ' . $info['url'] . "\n";
  echo 'HTTP-код: ' . $info['http_code'] . "\n";
  echo 'Общее количество редиректов: ' . $info['redirect_count'] . "\n";
}
curl_close($ch);
Конечный URL: http://httpbin.org/get
HTTP-код: 200
Общее количество редиректов: 2

Пояснение: опция CURLOPT_FOLLOWLOCATION включает автоматическое следование редиректам, CURLOPT_MAXREDIRS ограничивает их число. Функция обратного вызова CURLOPT_HEADERFUNCTION позволяет перехватывать заголовки ответа.

Пример 4: Получение HTML с таймаутом и повторной попыткой при ошибке

Пример

function getHtmlWithRetry($url, $maxAttempts = 3) {
  for ($i = 1; $i <= $maxAttempts; $i++) {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_TIMEOUT => 5,
      CURLOPT_CONNECTTIMEOUT => 3,
      CURLOPT_FOLLOWLOCATION => true
    ]);
    $html = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($html !== false && $httpCode === 200) {
      return $html;
    }
    usleep(1000000); // 1 секунда
  }
  return false;
}

$html = getHtmlWithRetry('https://example.com/');
if ($html !== false) {
  echo 'HTML получен после ' . ($i ?? 'до 3') . ' попыток.';
} else {
  echo 'Не удалось загрузить страницу после нескольких попыток.';
}
HTML получен после 1 попыток.

Пояснение: функция циклически повторяет запрос до тех пор, пока не получит успешный ответ (HTTP 200) или не исчерпает лимит попыток. Задержка между попытками помогает избежать перегрузки сервера.

Пример 5: Сохранение загруженного HTML в файл и вывод части содержимого

Пример

$url = 'https://www.php.net/';
$html = file_get_contents($url);
if ($html !== false) {
  file_put_contents('php_net_page.html', $html);
  echo 'Файл сохранён. Первые 500 символов:' . "\n";
  echo htmlspecialchars(substr($html, 0, 500));
} else {
  echo 'Ошибка получения страницы.';
}
Файл сохранён. Первые 500 символов:
<!DOCTYPE html>
<html lang="ru">
...

Пояснение: file_put_contents записывает полученную строку в файл. substr извлекает начало содержимого для демонстрации.

Получение HTML файла через PHP - comments

En
Php file get html (php)