PHP cURL: ответ сервера и его анализ
Ответ PHP cURL: обработка и анализ результатов
При выполнении HTTP запроса через cURL в PHP ключевая задача - корректно получить и интерпретировать ответ сервера. Основное эффективное решение предполагает использование curl_exec с обязательной проверкой на ошибки и последующим извлечением данных через curl_getinfo и curl_error.
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ($response === false) {
$error = curl_error($ch);
// логирование или вывод ошибки
} else {
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// обработка тела ответа $response
}
curl_close($ch);
Php curl timeout (php curl таймаут)
После выполнения запроса $response содержит тело ответа (если включён CURLOPT_RETURNTRANSFER), а curl_getinfo возвращает метаинформацию, включая HTTP статус, время выполнения, размер и т.д. Проверка на false отлавливает сетевые ошибки и таймауты.
Как получить только HTTP заголовки ответа?
Для извлечения одних заголовков без тела используется опция CURLOPT_HEADER вместе с CURLOPT_NOBODY.
$ch = curl_init('https://example.com');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_NOBODY => true
]);
$headers = curl_exec($ch);
curl_close($ch);
echo $headers;
Php curl ssl (php curl ssl)
Результат - строка с заголовками ответа. Если нужно обработать заголовки как массив, используется функция http_parse_headers (из PECL) или ручной парсинг.
Как получить и тело, и заголовки одновременно?
Установка CURLOPT_HEADER в true без CURLOPT_NOBODY возвращает строку, содержащую сначала заголовки, затем пустую строку и тело. Для разделения этих частей можно использовать CURLINFO_HEADER_SIZE.
$ch = curl_init('https://example.com');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true
]);
$response = curl_exec($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
curl_close($ch);
Php curl ответ (ответ php curl)
Как обработать ответ в формате JSON?
После получения тела ответа его следует декодировать функцией json_decode. Рекомендуется проверять успешность декодирования и HTTP статус.
$ch = curl_init('https://api.example.com/users');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
$data = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE) {
// работа с $data
} else {
// ошибка парсинга JSON
}
} else {
// обработка ошибки HTTP
}
Php curl authorization (php curl авторизация)
Как обработать ответ в формате XML?
Для XML можно использовать simplexml_load_string или класс DOMDocument.
$ch = curl_init('https://api.example.com/data.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xmlString = curl_exec($ch);
curl_close($ch);
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
// ошибка разбора XML
} else {
// работа с $xml
}
Типичные проблемы и их решения
Пустой ответ или false. Чаще всего вызвано недоступностью хоста, таймаутом или блокировкой со стороны сервера. Проверьте curl_error и curl_errno. Увеличьте таймаут через CURLOPT_TIMEOUT и CURLOPT_CONNECTTIMEOUT.
Ошибка SSL (SSL certificate problem). Возникает при самоподписанных сертификатах или устаревшей цепочке. Варианты: установить CURLOPT_SSL_VERIFYPEER в false (не рекомендуется для боевых систем) или указать путь к CA-папке через CURLOPT_CAINFO.
Некорректная кодировка ответа. Ответ может прийти в UTF-8, Windows-1251 и т.д. Используйте mb_convert_encoding или проверку заголовка Content-Type.
Редиректы не обрабатываются. По умолчанию cURL не следует редиректам. Включите CURLOPT_FOLLOWLOCATION и ограничьте число редиректов CURLOPT_MAXREDIRS.
Расширенные примеры работы с ответом cURL
1. Получение данных от REST API с аутентификацией Bearer
$url = 'https://api.example.com/orders';
$token = 'your_bearer_token';
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Accept: application/json'
],
CURLOPT_TIMEOUT => 30
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
$orders = json_decode($response, true);
print_r($orders);
} else {
echo "Ошибка HTTP $httpCode";
}
Array
(
[0] => Array
(
[id] => 123
[status] => completed
)
)
2. Отправка POST запроса с JSON данными и обработка ответа
$url = 'https://httpbin.org/post';
$data = ['name' => 'Василий', 'age' => 30];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => ['Content-Type: application/json']
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP код: $httpCode\n";
echo $response;
HTTP код: 200
{
"args": {},
"data": "{\"name\":\"Василий\",\"age\":30}",
"files": {},
"form": {},
"headers": {
"Content-Type": "application/json"
},
"json": {
"age": 30,
"name": "Василий"
},
"url": "https://httpbin.org/post"
}
3. Загрузка файла через POST (multipart/form-data) с получением ответа
$url = 'https://httpbin.org/post';
$filePath = '/path/to/photo.jpg';
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'image' => new CURLFile($filePath, 'image/jpeg', 'photo.jpg'),
'description' => 'Test upload'
]
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"files": {
"image": "data:image/jpeg;base64,..."
},
"form": {
"description": "Test upload"
}
}
4. Множественные параллельные запросы через curl_multi и сбор ответов
$urls = [
'https://api.example.com/user/1',
'https://api.example.com/user/2',
'https://api.example.com/user/3'
];
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10
]);
curl_multi_add_handle($mh, $ch);
$handles[$i] = $ch;
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
$results = [];
foreach ($handles as $i => $ch) {
$results[$i] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
print_r($results);
Array
(
[0] => {"id":1,"name":"Alice"}
[1] => {"id":2,"name":"Bob"}
[2] => {"id":3,"name":"Charlie"}
)
5. Работа с куками: получение и отправка Cookie
$cookieFile = '/tmp/cookies.txt';
// Первый запрос для получения куки
$ch = curl_init('https://example.com/login');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => 'username=admin&password=secret',
CURLOPT_COOKIEJAR => $cookieFile
]);
$response = curl_exec($ch);
curl_close($ch);
// Второй запрос с передачей куки
$ch = curl_init('https://example.com/profile');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEFILE => $cookieFile
]);
$profile = curl_exec($ch);
curl_close($ch);
echo $profile;
6. Использование прокси и обработка ответа через прокси
$ch = curl_init('https://httpbin.org/ip');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_PROXY => 'http://proxy.example.com:8080',
CURLOPT_PROXYUSERPWD => 'user:pass',
CURLOPT_PROXYTYPE => CURLPROXY_HTTP
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP код: $httpCode, ответ: $response";
7. Проверка времени выполнения и размера ответа
$ch = curl_init('https://example.com/large-file');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30
]);
$start = microtime(true);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
$duration = microtime(true) - $start;
echo "Длительность: " . round($duration, 3) . " сек\n";
echo "HTTP код: " . $info['http_code'] . "\n";
echo "Размер контента: " . $info['size_download'] . " байт\n";
echo "Время загрузки: " . $info['total_time'] . " сек\n";