Как в PHP выполнить HTTP-запрос с помощью cURL?

«Как в PHP выполнить HTTP-запрос с помощью cURL?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В PHP для выполнения HTTP-запросов используется расширение cURL. Основной процесс включает инициализацию сессии, настройку опций, выполнение и закрытие.

Базовый шаблон для GET-запроса:

// 1. Инициализация сессии cURL
$ch = curl_init();

// 2. Настройка параметров запроса
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Возвращать ответ в виде строки, а не выводить
curl_setopt($ch, CURLOPT_HEADER, false); // Не включать заголовки в вывод

// 3. Выполнение запроса и получение ответа
$response = curl_exec($ch);

// 4. Проверка на ошибки
if ($response === false) {
    $error = curl_error($ch);
    // Обработка ошибки (логирование, исключение и т.д.)
    throw new Exception("cURL Error: {$error}");
}

// 5. Получение HTTP-кода статуса
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// 6. Закрытие сессии cURL
curl_close($ch);

// 7. Работа с ответом (например, JSON)
$data = json_decode($response, true);

Пример POST-запроса с JSON-телом:

$payload = json_encode(['name' => 'John', 'age' => 30]);

$ch = curl_init('https://api.example.com/users');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $payload, // Тело запроса
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Content-Length: ' . strlen($payload)
    ],
]);

$response = curl_exec($ch);
curl_close($ch);

Ключевые опции:

  • CURLOPT_TIMEOUT: Таймаут выполнения.
  • CURLOPT_SSL_VERIFYPEER: Проверка SSL-сертификата (отключить для тестов).
  • CURLOPT_FOLLOWLOCATION: Следовать редиректам.
  • CURLOPT_CUSTOMREQUEST: Для методов типа PUT, DELETE.

Использование curl_setopt_array улучшает читаемость при множестве опций.