Работа с HTTP запросами в PHP: расширения и инструменты

Раздел: Расширения PHP -> HTTP запросы

Расширение HTTP (pecl_http) предоставляет классы для отправки HTTP запросов и обработки ответов. В этой статье рассмотрены основные возможности, альтернативные методы, типичные проблемы и способы их решения.

Основное решение: расширение HTTP (pecl_http)

Расширение HTTP для PHP (устанавливается через pecl install http) включает классы HttpRequest, HttpResponse, HttpMessage и другие. Оно позволяет гибко управлять запросами, обрабатывать заголовки, тела ответов, работать с куки и сессиями.


// Установка: pecl install http
// Требуется включить extension=http.so в php.ini

// Простой GET запрос
$request = new HttpRequest('https://api.example.com/data', HttpRequest::METH_GET);
$request->send();
$body = $request->getResponseBody();
echo $body;
  

Php get (обработка get запросов в php)

{"status": "ok", "data": [...]}
  

Https client php (http клиент на php)

Для POST запроса с данными и заголовками:


$request = new HttpRequest('https://httpbin.org/post', HttpRequest::METH_POST);
$request->setPostFields(['name' => 'John', 'age' => 30]);
$request->setHeaders(['Authorization' => 'Bearer token123', 'Content-Type' => 'application/x-www-form-urlencoded']);
$request->send();
echo $request->getResponseCode();
echo $request->getResponseBody();
  

Php file http (работа с файлами по http в php)

200
{"form": {"name": "John", "age": "30"}, ...}
  

Http content php (отправка контента по http в php)

Проблема: Класс HttpRequest не найден. Решение: проверить установку расширения (php -m | grep http), включить его в php.ini. Если не помогает, использовать альтернативы, описанные ниже.

Распространённая ошибка: Connection timed out. Настроить таймаут через $request->setOptions(['timeout' => 10]);

Варианты решения

Как отправлять HTTP запросы с помощью cURL?

Расширение cURL - одно из самых популярных и стабильных решений для работы с HTTP в PHP. Оно поддерживает множество протоколов, SSL, прокси, куки и параллельные запросы.


$ch = curl_init('https://api.example.com/items');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: application/json']);
$response = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Ошибка: ' . curl_error($ch);
} else {
    echo $response;
}
curl_close($ch);
  

Php https post (отправка https post запросов в php)

[{"id": 1, "name": "Item1"}]
  

Php post json (php: отправка post-запроса с json)

Пример POST запроса с данными в формате JSON:


$ch = curl_init('https://httpbin.org/post');
$payload = json_encode(['title' => 'Test', 'body' => 'Hello']);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $payload,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
  

Request php (обработка http запросов в php)

{"json": {"title": "Test", "body": "Hello"}, ...}
  

Php content json (php: установка content-type: application/json)

Проблема: cURL не установлен. Решение: установить расширение через apt install php-curl (Linux) или включить в php.ini. SSL-ошибки: отключить проверку (CURLOPT_SSL_VERIFYPEER = false) для тестов, но в продакшене следует настроить сертификаты.

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

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


$opts = [
    'http' => [
        'method' => 'GET',
        'header' => "User-Agent: MyApp\r\nAccept: application/json"
    ]
];
$context = stream_context_create($opts);
$result = file_get_contents('https://jsonplaceholder.typicode.com/posts/1', false, $context);
if ($result === false) {
    echo 'Ошибка получения данных';
} else {
    echo $result;
}
  

Php get request (get запрос в php)

{"userId": 1, "id": 1, "title": "..."}
  

Php post request (post запрос в php)

Для POST запроса:


$data = http_build_query(['key' => 'value']);
$opts = [
    'http' => [
        'method' => 'POST',
        'header' => "Content-Type: application/x-www-form-urlencoded\r\nContent-Length: " . strlen($data),
        'content' => $data
    ]
];
$context = stream_context_create($opts);
$result = file_get_contents('https://httpbin.org/post', false, $context);
echo $result;
  

Home php id index (передача параметра id в home.php)

{"form": {"key": "value"}, ...}
  

Проблема: Возвращает false без деталей ошибки. Использовать error_get_last() для диагностики. Также может не работать с HTTPS, если не настроено расширение openssl.

- Php id 1 (передача параметра id в php)
- Php запрос страницы (запрос страницы в php)
- Php получить (получение данных в php)

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

Пример

// ---------- 1. HttpRequest с аутентификацией и куки ----------
$request = new HttpRequest('https://api.example.com/login', HttpRequest::METH_POST);
$request->setPostFields(['username' => 'admin', 'password' => 'secret']);
$request->setOptions(['redirect' => 0]); // не следовать редиректам
$request->send();
// Получить cookie из ответа
$response = $request->getResponseMessage();
$cookies = $response->getHeader('Set-Cookie');
echo 'Cookie: ' . $cookies;
// Следующий запрос с куки
$request2 = new HttpRequest('https://api.example.com/profile');
$request2->setHeaders(['Cookie' => $cookies]);
$request2->send();
echo $request2->getResponseBody();
Cookie: PHPSESSID=abc123; path=/
{"profile": {...}}
Пример

// ---------- 2. Параллельные запросы через HttpRequestPool ----------
$pool = new HttpRequestPool();
$urls = ['https://httpbin.org/get', 'https://jsonplaceholder.typicode.com/todos/1'];
foreach ($urls as $url) {
    $request = new HttpRequest($url, HttpRequest::METH_GET);
    $pool->attach($request);
}
// Отправить все одновременно
$pool->send();
// Проверить результаты
foreach ($pool as $request) {
    echo 'URL: ' . $request->getUrl() . PHP_EOL;
    echo 'Code: ' . $request->getResponseCode() . PHP_EOL;
    echo 'Body: ' . substr($request->getResponseBody(), 0, 50) . PHP_EOL . PHP_EOL;
}
URL: https://httpbin.org/get
Code: 200
Body: {"args":{},"headers":{"Host":"httpbin.org"},...

URL: https://jsonplaceholder.typicode.com/todos/1
Code: 200
Body: {"userId":1,"id":1,"title":"delectus aut autem"...
Пример

// ---------- 3. cURL multi handle для асинхронных запросов ----------
$mh = curl_multi_init();
$ch1 = curl_init('https://httpbin.org/delay/1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
$ch2 = curl_init('https://httpbin.org/delay/2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
$active = null;
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh); // ожидание активности
    }
} while ($active && $status == CURLM_OK);
$content1 = curl_multi_getcontent($ch1);
$content2 = curl_multi_getcontent($ch2);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
echo 'Response 1: ' . substr($content1, 0, 30) . PHP_EOL;
echo 'Response 2: ' . substr($content2, 0, 30) . PHP_EOL;
Response 1: {"args":{},"data":"",...
Response 2: {"args":{},"data":"",...
Пример

// ---------- 4. file_get_contents с кастомным методом DELETE ----------
$opts = [
    'http' => [
        'method' => 'DELETE',
        'header' => "Authorization: Bearer token123"
    ]
];
$context = stream_context_create($opts);
$result = file_get_contents('https://api.example.com/resource/42', false, $context);
if ($result === false) {
    $error = error_get_last();
    echo 'Ошибка: ' . $error['message'];
} else {
    echo 'Удаление выполнено, статус: ' . substr($http_response_header[0], 9, 3);
}
// $http_response_header - автоматическая переменная с заголовками ответа
Удаление выполнено, статус: 204
Пример

// ---------- 5. Работа с ответом HttpMessage (расширение HTTP) ----------
$request = new HttpRequest('https://httpbin.org/response-headers?freeform=hello');
$request->send();
$message = $request->getResponseMessage();
echo 'Протокол: ' . $message->getHttpVersion() . PHP_EOL;
echo 'Код: ' . $message->getResponseCode() . PHP_EOL;
echo 'Заголовки: ' . print_r($message->getHeaders(), true) . PHP_EOL;
// Итерация по заголовкам
foreach ($message->getHeaders() as $name => $value) {
    echo "$name: $value" . PHP_EOL;
}
// Тело ответа
$body = $message->getBody();
echo 'Тело: ' . $body;
Протокол: 1.1
Код: 200
Заголовки: Array
(
    [Content-Type] => application/json
    [freeform] => hello
    ...
)
Тело: {"freeform":"hello"}

Расширение HTTP для PHP - comments

En
Php http extension (php)