Выполнение HTTPS запросов в PHP: выбор инструмента

Раздел: -> HTTP запросы

Основные способы создания HTTP клиента

Как выполнять HTTPS запросы с полным контролем параметров?

Наиболее эффективное решение - использование расширения cURL. Оно поддерживает протоколы HTTP и HTTPS, позволяет настраивать таймауты, заголовки, тело запроса, сертификаты и многое другое.

Пример простого GET запроса:


$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
    $error = curl_error($ch);
    // обработка ошибки
}
curl_close($ch);

Пояснения: curl_init создаёт сессию, CURLOPT_RETURNTRANSFER возвращает результат в переменную, CURLOPT_SSL_VERIFYPEER включает проверку SSL сертификата.

Типичные проблемы: отсутствие расширения curl в PHP (проверяется функцией extension_loaded('curl')), ошибки SSL (необходимо указать путь к CA bundle через CURLOPT_CAINFO), неверно указанный URL, проблемы с прокси.

Как отправить простой GET или POST запрос без установки дополнительных библиотек?

Встроенная функция file_get_contents с контекстом потока позволяет выполнять запросы без внешних зависимостей.

Пример POST запроса с JSON:


$data = json_encode(['key' => 'value']);
$options = [
    'http' => [
        'method' => 'POST',
        'header' => "Content-Type: application/json\r\n",
        'content' => $data
    ]
];
$context = stream_context_create($options);
$response = file_get_contents('https://api.example.com/submit', false, $context);

Пояснения: stream_context_create создаёт контекст с настройками, file_get_contents выполняет запрос.

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

Как использовать мощный HTTP клиент с поддержкой PSR-7 и асинхронных запросов?

Библиотека Guzzle предоставляет удобный объектно-ориентированный интерфейс для работы с HTTP.

Пример установки через Composer:


composer require guzzlehttp/guzzle

Пример GET запроса:


use GuzzleHttp\Client;

$client = new Client();
$response = $client->get('https://api.example.com/data');
$body = $response->getBody()->getContents();

Ошибки: необходимость установки Composer и загрузки зависимостей, более высокое потребление памяти, для простых запросов избыточен.

Расширенные примеры использования HTTP клиента

Как отправить GET запрос с параметрами через cURL?

Пример

$url = 'https://httpbin.org/get';
$params = ['foo' => 'bar', 'baz' => 'qux'];
$url .= '?' . http_build_query($params);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

echo $response;
{
  "args": {
    "foo": "bar",
    "baz": "qux"
  },
  "headers": { ... },
  ...
}

Как отправить POST запрос с JSON телом и обработать ответ?

Пример

$data = json_encode(['username' => 'test', 'password' => 'secret']);

$ch = curl_init('https://httpbin.org/post');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "HTTP код: $httpCode\n";
echo $response;
HTTP код: 200
{
  "json": {
    "username": "test",
    "password": "secret"
  },
  ...
}

Как загрузить файл через multipart/form-data с помощью cURL?

Пример

$file = new CURLFile('/path/to/file.txt', 'text/plain', 'file.txt');

$ch = curl_init('https://httpbin.org/post');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => $file]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

echo $response;
{
  "files": {
    "file": "Содержимое файла..."
  },
  ...
}

Как выполнить параллельные HTTP запросы (curl_multi)?

Пример

$urls = ['https://httpbin.org/get', 'https://httpbin.org/ip'];
$multiHandle = curl_multi_init();
$curlHandles = [];

foreach ($urls as $i => $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$i] = $ch;
}

$running = null;
do {
    curl_multi_exec($multiHandle, $running);
} while ($running > 0);

foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n---\n";
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

curl_multi_close($multiHandle);
{
  "args": {},
  ...
}
---
{
  "origin": "1.2.3.4"
}

Как отправить асинхронный запрос с Guzzle?

Пример

use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$client = new Client();
$promise = $client->getAsync('https://httpbin.org/delay/2');
$promise->then(
    function ($response) {
        echo $response->getBody();
    },
    function ($error) {
        echo 'Ошибка: ' . $error->getMessage();
    }
);
$promise->wait();
Через 2 секунды вывод:
{
  "url": "https://httpbin.org/delay/2",
  ...
}

Как использовать middleware для логирования в Guzzle?

Пример

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;

$stack = HandlerStack::create();
$stack->push(Middleware::log(
    new \Monolog\Logger('http'),
    new \Monolog\Handler\StreamHandler('php://stdout')
));

$client = new Client(['handler' => $stack]);
$response = $client->get('https://httpbin.org/get');
В консоль выводится запись лога:
[2025-04-01 12:00:00] http.INFO: GET https://httpbin.org/get ...

HTTP клиент на PHP - comments

En
Https client php (php)