Выполнение HTTPS запросов в PHP: выбор инструмента
Основные способы создания 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 ...