Содержимое ответа cURL в PHP: методы и рекомендации

Раздел: PHP -> HTTP запросы с cURL

Основные способы получения содержимого ответа cURL

Наиболее эффективный способ получить содержимое ответа - установить опцию CURLOPT_RETURNTRANSFER в значение true. После выполнения запроса функция curl_exec возвращает тело ответа в виде строки. Пример:


$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
curl_close($ch);
echo $content;

Php curl close (php curl close)

Этот подход удобен для дальнейшей обработки - парсинга JSON, XML или HTML. Все данные остаются в памяти, что позволяет сразу их анализировать.

Типичные ошибки: если сервер возвращает пустой ответ, причина может быть в отсутствии CURLOPT_RETURNTRANSFER - тогда curl_exec выводит данные напрямую и возвращает логическое значение. Также возможны ошибки при неправильном URL или проблемах с SSL. Используйте curl_error для диагностики.

Как сохранить содержимое ответа напрямую в файл?

Если ответ большой и не требуется хранить его в памяти, можно записать данные сразу в файл с помощью CURLOPT_FILE. Пример:


$ch = curl_init('https://example.com/large-file.zip');
$fp = fopen('/tmp/file.zip', 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);

Php curl cookie (php curl cookie)

Данные записываются по мере получения, что экономит память. Используется для загрузки архивов, изображений, видео.

Если файл не создаётся или запись прерывается, проверьте права на запись в каталог. При ошибках соединения файл может остаться пустым - следует проверять код возврата curl_exec.

Как получить содержимое вместе с HTTP-заголовками?

Опция CURLOPT_HEADER (значение true) включает заголовки ответа в возвращаемую строку. Однако часто требуется отдельно обработать заголовки и тело. Для этого используется CURLOPT_HEADERFUNCTION, который позволяет передать заголовки в callback-функцию:


$headers = [];
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($ch, $header) use (&$headers) {
    $headers[] = $header;
    return strlen($header);
});
$body = curl_exec($ch);
curl_close($ch);
print_r($headers);
echo $body;

Curl exec php (php curl exec)

Этот метод полезен для анализа статус-кода, Content-Type, cookies и других метаданных.

Если callback возвращает некорректную длину (меньше реальной длины строки заголовка), cURL может работать неправильно. Всегда возвращайте strlen($header).

Как обработать ответ в формате JSON?

После получения строки через curl_exec её можно декодировать функцией json_decode. Пример:


$ch = curl_init('https://api.github.com/repos/php/php-src');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERAGENT => 'PHP cURL'
]);
$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['full_name']);
} else {
    echo "Ошибка: $httpCode";
}

Php curl get (php curl get запрос)

Важно проверять HTTP-код ответа и корректность JSON (json_last_error).

Если JSON не парсится, причиной может быть BOM (Byte Order Mark) в начале ответа. Удалите его с помощью preg_replace('/^\xEF\xBB\xBF/', '', $response). Также не забывайте устанавливать корректный User-Agent для API.

Как обработать бинарный контент (изображение, PDF)?

Бинарные данные также получаются через CURLOPT_RETURNTRANSFER. Их можно сохранить в файл или использовать в коде (например, для создания изображения из строки). Пример сохранения:


$ch = curl_init('https://example.com/image.png');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$imageData = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
if ($info['http_code'] === 200) {
    file_put_contents('image.png', $imageData);
    echo 'Изображение сохранено. Размер: ' . strlen($imageData) . ' байт';
}

Php curl html (php curl html)

При скачивании больших файлов лучше использовать CURLOPT_FILE для экономии памяти.

Некоторые серверы могут возвращать бинарные данные с дополнительными символами (например, BOM). Всегда проверяйте Content-Type через curl_getinfo($ch, CURLINFO_CONTENT_TYPE). Если тип не соответствует ожидаемому, ответ может быть ошибочным.

Дополнительный вариант: получение контента через многопоточность (curl_multi)

Для параллельного получения нескольких ответов используйте curl_multi_exec. Пример:


$urls = ['https://example.com/a', 'https://example.com/b'];
$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);
    curl_multi_select($mh);
} while ($running > 0);
foreach ($handles as $ch) {
    $content = curl_multi_getcontent($ch);
    echo "Содержимое: $content\n";
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}
curl_multi_close($mh);

Позволяет ускорить сбор данных с нескольких источников. Важно правильно обрабатывать ошибки и timeout.

Ошибка curl_multi_select может возвращать -1 на некоторых системах. В таких случаях используйте цикл с задержкой (usleep). Также следите за максимальным количеством одновременных соединений.

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

Расширенные примеры работы с содержимым ответа cURL

Пример

// Пример 1: Получение контента с авторизацией и сохранением cookie
$cookieFile = '/tmp/cookies.txt';
$ch = curl_init('https://example.com/login');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query(['user' => 'admin', 'pass' => '123']),
    CURLOPT_COOKIEJAR => $cookieFile,
    CURLOPT_COOKIEFILE => $cookieFile,
    CURLOPT_FOLLOWLOCATION => true,
]);
$response = curl_exec($ch);
curl_close($ch);
// Теперь с тем же файлом cookie можно получать защищённые страницы
$ch2 = curl_init('https://example.com/profile');
curl_setopt_array($ch2, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEFILE => $cookieFile,
]);
$profile = curl_exec($ch2);
curl_close($ch2);
echo $profile;

Результат: выводится HTML-код профиля, если аутентификация прошла успешно. Ошибки сессии могут возникать при устаревших cookie.

Пример

// Пример 2: Обработка контента с HTTP-заголовками через callback и получение статуса
$ch = curl_init('https://httpbin.org/response-headers?freeform=hello');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header) {
    if (strpos($header, 'freeform:') !== false) {
        echo "Заголовок: " . $header;
    }
    return strlen($header);
});
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "\nHTTP код: $status";
echo "\nТело ответа: $body";

Результат: выводится значение заголовка freeform, статус 200 и тело ответа (обычно пустое). Позволяет динамически реагировать на заголовки.

Пример

// Пример 3: Получение контента через прокси (например, для работы с geo-ограничениями)
$ch = curl_init('https://whatismyipaddress.com');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_PROXY => 'http://proxy.example.com:8080',
    CURLOPT_PROXYUSERPWD => 'user:pass',
    CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
    CURLOPT_TIMEOUT => 30,
]);
$content = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Ошибка прокси: ' . curl_error($ch);
} else {
    // Парсим IP из HTML
    preg_match('/
([^<]+)<\/div>/', $content, $matches); echo 'IP через прокси: ' . ($matches[1] ?? 'не найден'); } curl_close($ch);

Результат: выводится IP-адрес, который видит целевой сервер (адрес прокси). Возможные проблемы - неверные учётные данные или закрытый порт.

Пример

// Пример 4: Загрузка файла с возобновлением (resume) и прогрессом
$ch = curl_init('https://example.com/large-file.zip');
$fp = fopen('/downloads/file.zip', 'a'); // 'a' для дозаписи
$existingSize = filesize('/downloads/file.zip');
fwrite($fp, str_repeat("\0", $existingSize)); // для корректного смещения
curl_setopt_array($ch, [
    CURLOPT_FILE => $fp,
    CURLOPT_RANGE => $existingSize . '-',   // только недостающая часть
    CURLOPT_RESUME_FROM => $existingSize,
    CURLOPT_NOPROGRESS => false,
    CURLOPT_PROGRESSFUNCTION => function($ch, $dltotal, $dlnow) {
        if ($dltotal > 0) {
            echo "Загружено: " . round($dlnow/$dltotal*100) . "%\r";
        }
    },
]);
curl_exec($ch);
curl_close($ch);
fclose($fp);
echo "\nЗагрузка завершена.";

Результат: в консоли отображается прогресс, файл догружается с места остановки. Ошибка: сервер может не поддерживать Range-запросы.

Пример

// Пример 5: Получение содержимого с SSL-сертификатом и проверкой пиров
$ch = curl_init('https://secure.example.com');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_CAINFO => '/path/to/cacert.pem',
    CURLOPT_SSLCERT => '/path/to/client.crt',
    CURLOPT_SSLCERTPASSWD => 'password',
    CURLOPT_SSLKEY => '/path/to/client.key',
]);
$content = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'SSL ошибка: ' . curl_error($ch);
} else {
    echo 'Соединение установлено, длина ответа: ' . strlen($content);
}
curl_close($ch);

Результат: при валидных сертификатах выводится длина ответа. Типичная ошибка - неверный путь к файлу CA или несовместимость формата ключа.

Пример

// Пример 6: Обработка chunked transfer encoding вручную
// cURL автоматически декодирует chunked, но можно получить сырые данные через CURLOPT_HTTP_TRANSFER_DECODING
$ch = curl_init('https://httpbin.org/stream-bytes/1024');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTP_TRANSFER_DECODING, false); // отключаем декодинг
$raw = curl_exec($ch);
curl_close($ch);
echo "Сырые данные:\n" . htmlspecialchars($raw);

Результат: отображается «сырое» тело с chunked-заголовками размера (шестнадцатеричные числа перед каждым чанком). Используется для отладки или проксирования.

Содержимое ответа PHP cURL - comments

En
Php curl content (php)