Как использовать cURL в PHP для отправки HTTP GET запросов

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

Основы выполнения GET запросов с cURL в PHP

cURL (Client URL Library) позволяет PHP скриптам взаимодействовать с удалёнными серверами по протоколу HTTP. Для отправки GET запроса достаточно настроить несколько опций и выполнить получение ответа.

Как выполнить простейший GET запрос с выводом содержимого страницы?

Самый эффективный способ - использовать функции curl_init(), curl_setopt() и curl_exec(). Ниже приведён минимальный рабочий пример.


<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

Php curl close (php curl close)

Опция CURLOPT_RETURNTRANSFER заставляет cURL возвращать ответ в виде строки, а не выводить его напрямую. После выполнения запроса ресурс закрывается вызовом curl_close().

Типичная ошибка:

Если забыть установить CURLOPT_RETURNTRANSFER, то содержимое будет выведено сразу, а в переменную $response попадёт булево значение true. Это приводит к пустому выводу при последующем echo.

Решение:

Всегда проверять код возврата curl_errno() и выводить ошибку через curl_error().

Как отправить GET запрос с параметрами (query string)?

Параметры можно добавить непосредственно в URL, либо сформировать строку запроса через http_build_query().


<?php
$params = ['name' => 'John', 'age' => 30];
$url = 'https://api.example.com/search?' . http_build_query($params);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
?>

Php curl cookie (php curl cookie)

Пояснение:

http_build_query() автоматически кодирует ключи и значения, формируя корректную строку запроса. Это удобно при работе с массивами.

Как получить заголовки ответа вместе с телом?

Используется опция CURLOPT_HEADER. Установив её в true, cURL вернёт заголовки вместе с содержимым.


<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
// Разделение заголовков и тела
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
curl_close($ch);
?>

Curl exec php (php curl exec)

Замечание:

Для отдельного получения заголовков без тела можно использовать CURLOPT_NOBODY.

Проблема:

При одновременном получении заголовков и тела в одном ответе сложно разграничить данные, если не знать размер заголовков. Используйте curl_getinfo($ch, CURLINFO_HEADER_SIZE) для точного разделения.

Как заставить cURL следовать редиректам?

Опция CURLOPT_FOLLOWLOCATION позволяет автоматически переходить по HTTP-редиректам (301, 302 и т. д.).


<?php
$ch = curl_init('http://example.com/redirect');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

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

Дополнительно:

Можно ограничить количество редиректов опцией CURLOPT_MAXREDIRS.

Ошибка:

Если сервер возвращает редирект на другой протокол (например, с HTTP на HTTPS), может потребоваться также включить CURLOPT_SSL_VERIFYPEER.

Как отключить проверку SSL сертификата?

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


<?php
$ch = curl_init('https://self-signed.badssl.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
curl_close($ch);
?>

Php curl html (php curl html)

Важно:

В продакшене отключать проверку SSL небезопасно. Лучше указать путь к CA-сертификатам через CURLOPT_CAINFO.

Ошибка:

При CURLOPT_SSL_VERIFYPEER = false запрос становится уязвимым для MITM-атак. Используйте только для отладки.

Как добавить пользовательские заголовки (User-Agent, Referer и т.д.)?

Опция CURLOPT_HTTPHEADER принимает массив строк с заголовками.


<?php
$ch = curl_init('https://api.example.com/data');
$headers = [
    'User-Agent: MyCustomAgent/1.0',
    'Accept: application/json',
    'Authorization: Bearer token123'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
?>

Php curl https (php curl https)

Замечание:

Если заголовок содержит двоеточие, он будет интерпретирован как часть значения. Формат: 'Имя: Значение'.

Как обработать ошибки соединения и таймауты?

Проверка кода ошибки и установка таймаута - обязательные шаги для стабильной работы.


<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 10 секунд
$response = curl_exec($ch);

if(curl_errno($ch)) {
    echo 'Ошибка: ' . curl_error($ch);
} else {
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo 'HTTP код: ' . $httpCode;
}
curl_close($ch);
?>

Php curl init (php curl init)

Типичные ошибки:

  • CURLE_OPERATION_TIMEDOUT (28) - превышен таймаут; увеличьте CURLOPT_TIMEOUT или время ожидания соединения через CURLOPT_CONNECTTIMEOUT.
  • CURLE_COULDNT_CONNECT (7) - сервер недоступен; проверьте URL и доступность сети.
  • CURLE_SSL_CONNECT_ERROR (35) - проблемы с SSL; проверьте версию PHP и наличие OpenSSL.

Как выполнить GET запрос через прокси-сервер?

Опции CURLOPT_PROXY, CURLOPT_PROXYPORT и при необходимости CURLOPT_PROXYUSERPWD.


<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com');
curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:pass');
$response = curl_exec($ch);
curl_close($ch);
?>

Curl setopt php (php curl setopt)

Тип прокси:

По умолчанию cURL ожидает HTTP-прокси. Для SOCKS используйте CURLOPT_PROXYTYPE.

Проблема:

Если прокси требует аутентификации, но учётные данные не переданы, cURL вернёт ошибку 407. Передавайте логин и пароль через CURLOPT_PROXYUSERPWD.

Как получить подробную информацию о запросе (метрики)?

Функция curl_getinfo() возвращает массив с данными: HTTP-код, время выполнения, размер и т.д.


<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info);
curl_close($ch);
?>

Php curl ssl (php curl ssl)

Array
(
    [url] => https://api.example.com/data
    [http_code] => 200
    [total_time] => 0.543
    [size_download] => 1234
    ...
)

Назначение:

Позволяет отлаживать производительность и проверять корректность ответа сервера.

Какие ещё частые ошибки возникают при работе с cURL GET?

  • Пустой ответ при правильном коде - возможно, сервер ожидает определённые заголовки (Accept, User-Agent). Добавьте их через CURLOPT_HTTPHEADER.
  • Ошибка "SSL certificate problem: unable to get local issuer certificate" - на сервере не настроена цепочка сертификатов. Решение: либо отключить проверку (не рекомендуется), либо загрузить актуальный bundle сертификатов и указать CURLOPT_CAINFO.
  • Проблемы с кодировкой - если ответ содержит символы не в UTF-8, может потребоваться обработка через mb_convert_encoding.
  • Отсутствие расширения cURL - убедитесь, что в php.ini раскомментирована строка extension=curl.
- Php curl error (ошибки php curl)
- Php curl timeout (php curl таймаут)
- Php curl ответ (ответ php curl)

Расширенные примеры использования cURL для GET запросов

В этом разделе представлены более сложные сценарии, которые могут потребоваться при интеграции с различными API или при отладке.

Пример полного цикла с проверкой HTTP-статуса и обработкой ошибок

Пример

<?php
function curl_get_contents($url, $timeout = 30) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    $errno = curl_errno($ch);
    curl_close($ch);
    
    if ($errno) {
        throw new Exception("cURL ошибка ($errno): $error");
    }
    if ($httpCode >= 400) {
        throw new Exception("HTTP ошибка: $httpCode");
    }
    return $response;
}

try {
    $data = curl_get_contents('https://jsonplaceholder.typicode.com/posts/1');
    echo $data;
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>
{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit..."
}

Как отправить GET запрос с куками (cookies) и сохранить их для последующих запросов

Пример

<?php
$cookieFile = '/tmp/cookies.txt'; // файл для хранения кук

// Первый запрос - получаем куки
$ch = curl_init('https://example.com/login');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // сохранять новые куки
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // отправлять сохранённые
$response = curl_exec($ch);
curl_close($ch);

// Второй запрос - куки уже присутствуют
$ch2 = curl_init('https://example.com/dashboard');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookieFile);
$dashboard = curl_exec($ch2);
curl_close($ch2);
echo $dashboard;
?>

Пояснение:

CURLOPT_COOKIEJAR указывает файл, в который cURL запишет куки из ответа сервера. CURLOPT_COOKIEFILE задаёт файл, откуда брать куки для отправки. Обычно оба указывают на один и тот же файл.

Как использовать cURL в цикле для массовых GET запросов (с ограничением параллельности)

Пример

<?php
$urls = [
    'https://api1.example.com/items/1',
    'https://api1.example.com/items/2',
    'https://api1.example.com/items/3'
];
$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;
}

$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM || $active);

foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo 'Ответ: ' . $response . PHP_EOL;
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}
curl_multi_close($multiHandle);
?>

Результат:

Ответ: {"id":1,"name":"Item 1"}
Ответ: {"id":2,"name":"Item 2"}
Ответ: {"id":3,"name":"Item 3"}

Назначение:

curl_multi позволяет выполнять запросы асинхронно, ускоряя выборку множества URL. Важно обрабатывать завершение каждого запроса, так как curl_multi_exec не блокирует выполнение.

Как отправить GET запрос с базовой HTTP-аутентификацией

Пример

<?php
$ch = curl_init('https://api.example.com/secure');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

Пояснение:

Авторизация передаётся в заголовке Authorization: Basic .... Тип аутентификации можно комбинировать: CURLAUTH_ANY.

Как обработать ответ в формате JSON и получить конкретное поле

Пример

<?php
$ch = curl_init('https://api.example.com/user/123');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE) {
    echo 'Имя пользователя: ' . ($data['name'] ?? 'не указано');
} else {
    echo 'Ошибка декодирования JSON';
}
?>
Имя пользователя: Иван Петров

Как логировать все этапы запроса (отладка)

Пример

<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$verbose = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);

$response = curl_exec($ch);

rewind($verbose);
$log = stream_get_contents($verbose);
echo "<pre>Лог запроса:\n$log</pre>";

curl_close($ch);
?>

Результат:

*   Trying 93.184.216.34:443...
* Connected to api.example.com (93.184.216.34) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
...

Назначение:

Опция CURLOPT_VERBOSE включает вывод подробной информации о рукопожатии, заголовках и времени. Данные направляются в поток, заданный CURLOPT_STDERR.

Как ограничить скорость загрузки (bandwidth throttling)

Пример

<?php
$ch = curl_init('https://speedtest.example.com/largefile');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_MAX_RECV_SPEED_LARGE, 1024 * 50); // 50 KB/s
$data = curl_exec($ch);
curl_close($ch);
?>

Пояснение:

Опция CURLOPT_MAX_RECV_SPEED_LARGE ограничивает скорость приёма данных. Полезна для предотвращения перегрузки сети.

Как использовать константу CURLOPT_CUSTOMREQUEST для нестандартных методов (но GET остаётся GET)

Пример

<?php
$ch = curl_init('https://api.example.com/resource');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); // можно не указывать, так как по умолчанию GET
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
?>

Обычно CURLOPT_CUSTOMREQUEST применяется для методов вроде PATCH или DELETE, но его можно использовать и для явного указания GET.

PHP cURL GET запрос - comments

En
Php curl get (php)