PHP cURL: ответ сервера и его анализ

Раздел: PHP -> HTTP запросы с 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.

- Php curl url (php curl url)
- Curl exec php (php curl exec)
- Curl setopt php (php curl setopt)

Расширенные примеры работы с ответом 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";

Ответ PHP cURL - comments

En
Php curl ответ (php)