Отправка HTTP запросов в PHP: практические примеры
Обзор способов отправки HTTP запросов в PHP
Как отправить HTTP запрос с помощью cURL?
Библиотека cURL является наиболее гибким и распространённым инструментом для работы с HTTP в PHP. Она поддерживает все методы (GET, POST, PUT, DELETE и др.), работу с заголовками, cookie, сертификатами, прокси и таймаутами. Решение подходит для любых сценариев - от простых запросов к API до сложных многопоточных операций.
Пример базового GET запроса:
<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Ошибка cURL: ' . curl_error($ch);
}
curl_close($ch);
echo $response;
?>
Php отправка запроса (отправка http запроса на php)
Пояснение: curl_init создаёт сессию, CURLOPT_RETURNTRANSFER возвращает результат в переменную вместо вывода в поток. После выполнения проверяется код ошибки, затем сессия закрывается.
Типичные проблемы:
- Ошибка SSL-сертификата - решается установкой CURLOPT_SSL_VERIFYPEER в false (не рекомендуется для продакшена) или указанием пути к CA bundle через CURLOPT_CAINFO.
- Пустой ответ - часто из-за недоступности хоста или блокировки firewall.
- Медленные запросы - настройка таймаутов через CURLOPT_TIMEOUT и CURLOPT_CONNECTTIMEOUT.
Как отправить запрос без cURL, используя file_get_contents?
Функция file_get_contents с контекстом потока позволяет выполнять HTTP запросы без внешних расширений. Подходит для простых GET и POST запросов, когда нет необходимости в тонкой настройке.
<?php
$options = [
'http' => [
'method' => 'GET',
'header' => "User-Agent: MyApp\r\n"
]
];
$context = stream_context_create($options);
$result = file_get_contents('https://api.example.com/data', false, $context);
if ($result === false) {
echo 'Ошибка при загрузке';
}
echo $result;
?>
Для POST запроса меняется метод и добавляется поле content:
<?php
$data = http_build_query(['key' => 'value']);
$options = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
'content' => $data
]
];
$context = stream_context_create($options);
$result = file_get_contents('https://api.example.com/submit', false, $context);
?>
Типичные ошибки:
- Запрет удалённых открытий в php.ini - директива allow_url_fopen должна быть включена.
- Отсутствие обработки HTTP-кодов ответа - функция не выбрасывает исключения при 404 или 500, нужно проверять через $http_response_header или использовать библиотеку.
Как отправить запрос через fsockopen для полного контроля?
fsockopen открывает сокет напрямую, позволяя вручную формировать HTTP-запрос. Применяется в низкоуровневых решениях, когда нужно обойти ограничения cURL или реализовать нестандартный протокол.
<?php
$fp = fsockopen('api.example.com', 80, $errno, $errstr, 30);
if (!$fp) {
echo "Ошибка: $errstr ($errno)";
} else {
$request = "GET /data HTTP/1.1\r\n";
$request .= "Host: api.example.com\r\n";
$request .= "Connection: Close\r\n\r\n";
fwrite($fp, $request);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
Проблемы: сложность обработки chunked encoding, ручное управление заголовками, отсутствие автоматического следования редиректам. Подходит только для простых случаев.
Как использовать Guzzle для современной работы с HTTP?
Guzzle - популярная PHP-библиотека, построенная на PSR-7 и PSR-18. Предоставляет удобный объектно-ориентированный интерфейс, поддержку middleware, асинхронных запросов и потоков. Рекомендуется для новых проектов.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://api.example.com']);
$response = $client->get('/data', [
'headers' => ['User-Agent' => 'MyApp']
]);
echo $response->getBody();
?>
Типичные ошибки:
- Не установлена зависимость - требуется Composer.
- Исключения при ошибках - Guzzle выбрасывает GuzzleHttp\Exception\ClientException для кодов 4xx.
Расширенные примеры работы с HTTP запросами в PHP
1. Многопоточные запросы с curl_multi
Для одновременной отправки нескольких запросов используйте curl_multi. Это ускоряет сбор данных с нескольких источников.
<?php
$urls = [
'https://api.example.com/1',
'https://api.example.com/2',
'https://api.example.com/3'
];
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$handles[$i] = $ch;
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
?>
Вывод: данные с каждого URL последовательно (порядок не гарантируется).
2. Отправка запроса с авторизацией Bearer и обработкой JSON
<?php
$token = 'your_bearer_token';
$ch = curl_init('https://api.example.com/protected');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Accept: application/json'
]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
$data = json_decode($response, true);
print_r($data);
} else {
echo "Ошибка: HTTP $httpCode";
}
?>
Вывод: массив с данными ответа.
3. Отправка POST запроса с файлом через cURL
<?php
$file = new CURLFile('/path/to/file.jpg', 'image/jpeg', 'file.jpg');
$ch = curl_init('https://api.example.com/upload');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => ['file' => $file],
CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
4. Использование Guzzle с асинхронными запросами (Promise)
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Promise;
$client = new Client();
$promises = [
'one' => $client->getAsync('https://api.example.com/1'),
'two' => $client->getAsync('https://api.example.com/2')
];
$results = Promise\Utils::settle($promises)->wait();
foreach ($results as $key => $result) {
if ($result['state'] === 'fulfilled') {
echo $key . ': ' . $result['value']->getBody() . "\n";
} else {
echo $key . ': ошибка - ' . $result['reason'] . "\n";
}
}
?>
5. Настройка прокси через cURL
<?php
$ch = curl_init('https://api.example.com');
curl_setopt_array($ch, [
CURLOPT_PROXY => 'http://proxy.example.com:8080',
CURLOPT_PROXYUSERPWD => 'user:pass',
CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
6. Отправка запроса с помощью file_get_contents и проверка HTTP-кода
<?php
$options = [
'http' => [
'method' => 'GET',
'ignore_errors' => true
]
];
$context = stream_context_create($options);
$result = file_get_contents('https://httpstat.us/404', false, $context);
if ($http_response_header) {
preg_match('#HTTP/[0-9.]+ (\d+)#', $http_response_header[0], $matches);
$status = (int)$matches[1];
echo "HTTP код: $status\n";
}
echo $result;
?>
HTTP код: 404 404 Not Found