Как использовать cURL в PHP для отправки HTTP GET запросов
Основы выполнения 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.
Расширенные примеры использования 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.