HTTP клиент на PHP: делаем запросы правильно

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: зачем нужен HTTP-клиент в PHP?

Современные веб-приложения редко существуют изолированно. Они взаимодействуют с внешними API, сервисами микросервисной архитектуры, системами аналитики и платёжными шлюзами. В основе этого взаимодействия лежит протокол HTTP. Для PHP-разработчика умение правильно отправлять HTTP-запросы — не просто полезный навык, а обязательная часть профессионального инструментария.

В этой статье мы разберём три основных способа создания HTTP-клиента на PHP: от простого file_get_contents() до мощного cURL и современного пакета Guzzle. Вы узнаете, как выбирать подходящий инструмент, обрабатывать ошибки, работать с заголовками и обеспечивать безопасность запросов.

1. Простые запросы с file_get_contents()

Самый простой способ отправить GET-запрос в PHP — использовать встроенную функцию file_get_contents(). Этот метод подходит для быстрых прототипов и простых сценариев, когда не требуется тонкая настройка соединения.

Базовый GET-запрос

<?php
$url = 'https://api.example.com/data';
$response = file_get_contents($url);
if ($response === false) {
    echo 'Ошибка при получении данных';
} else {
    echo $response;
}
?>

Настройка контекста потоков

Для управления заголовками и методом запроса используйте stream_context_create(). Это позволяет отправлять POST-запросы и задавать кастомные заголовки.

<?php
$data = json_encode(['name' => 'John', 'email' => 'john@example.com']);
$options = [
    'http' => [
        'method' => 'POST',
        'header' => "Content-Type: application/json\r\n" .
                     "Accept: application/json\r\n",
        'content' => $data
    ]
];
$context = stream_context_create($options);
$result = file_get_contents('https://api.example.com/users', false, $context);
if ($result === false) {
    // Обработка ошибки
}
?>

Недостатки: file_get_contents() не поддерживает куки, таймауты на уровне соединения, обработку редиректов и работу с SSL-сертификатами. Для серьёзных проектов лучше использовать cURL или Guzzle.

2. Мощный и гибкий cURL

Расширение cURL (Client URL Library) — стандартный инструмент для работы с HTTP в PHP. Он предоставляет полный контроль над запросом: заголовки, тело, таймауты, аутентификацию, работу с файлами и многое другое.

Базовый GET-запрос с cURL

<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo "HTTP код: $httpCode\n";
    echo $response;
}
curl_close($ch);
?>

POST-запрос с JSON и заголовками

<?php
$postData = ['title' => 'PHP HTTP Client', 'body' => 'Пример запроса'];
$jsonData = json_encode($postData);
$ch = curl_init('https://jsonplaceholder.typicode.com/posts');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $jsonData,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Accept: application/json',
        'Authorization: Bearer YOUR_TOKEN_HERE'
    ],
    CURLOPT_TIMEOUT => 15,
    CURLOPT_SSL_VERIFYPEER => true // В продакшене всегда true!
]);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode >= 200 && $httpCode < 300) {
    $decoded = json_decode($result, true);
    print_r($decoded);
} else {
    echo "Ошибка: HTTP $httpCode";
}
?>

Полезные опции cURL

  • CURLOPT_FOLLOWLOCATION — автоматическое следование редиректам
  • CURLOPT_USERAGENT — установка User-Agent
  • CURLOPT_COOKIEFILE / CURLOPT_COOKIEJAR — работа с куками
  • CURLOPT_HTTPAUTH — базовая HTTP-аутентификация
  • CURLOPT_CONNECTTIMEOUT — таймаут соединения

3. Современный подход: библиотека Guzzle

Guzzle — это PHP HTTP-клиент, построенный на PSR-7 (стандарт HTTP-сообщений) и PSR-18 (HTTP-клиент). Он предоставляет объектно-ориентированный интерфейс, middleware для обработки запросов, асинхронные запросы и встроенную поддержку повторных попыток.

Установка через Composer

composer require guzzlehttp/guzzle

GET-запрос с Guzzle

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

$client = new Client([
    'base_uri' => 'https://api.github.com/',
    'timeout' => 10.0,
    'headers' => [
        'User-Agent' => 'PHP HTTP Client/1.0',
        'Accept' => 'application/json'
    ]
]);
try {
    $response = $client->get('users/octocat');
    $body = $response->getBody()->getContents();
    $statusCode = $response->getStatusCode();
    $data = json_decode($body, true);
    echo "Статус: $statusCode\n";
    echo "Логин: " . $data['login'];
} catch (RequestException $e) {
    if ($e->hasResponse()) {
        echo "Ошибка: " . $e->getResponse()->getStatusCode();
    } else {
        echo "Ошибка соединения: " . $e->getMessage();
    }
}
?>

POST-запрос с

Блоги

Рекомендаций по книгам