Работа с HTTP запросами в PHP: расширения и инструменты
Расширение 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.
Расширенные примеры использования
// ---------- 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"}