PHP

Отправка HTTP-запросов через cURL

Algonexys · 07.08.2026 · 👁 0

Обёртка с таймаутами, заголовками, разбором JSON и проверкой SSL.

Код

<?php
declare(strict_types=1);

function httpRequest(
    string $url,
    string $method = 'GET',
    ?array $payload = null,
    array $headers = []
): array {
    $ch = curl_init();
    $defaultHeaders = ['Accept: application/json', 'User-Agent: DigitMind/1.0'];

    $options = [
        CURLOPT_URL            => $url,
        CURLOPT_CUSTOMREQUEST  => strtoupper($method),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_MAXREDIRS      => 3,
        CURLOPT_CONNECTTIMEOUT => 5,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_SSL_VERIFYPEER => true,     // никогда не отключайте в продакшне
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_HTTPHEADER     => array_merge($defaultHeaders, $headers),
    ];

    if ($payload !== null) {
        $options[CURLOPT_POSTFIELDS] = json_encode($payload, JSON_UNESCAPED_UNICODE);
        $options[CURLOPT_HTTPHEADER][] = 'Content-Type: application/json';
    }

    curl_setopt_array($ch, $options);
    $body   = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    $error  = curl_error($ch);
    curl_close($ch);

    if ($body === false) {
        throw new RuntimeException('Ошибка cURL: ' . $error);
    }

    return [
        'status' => $status,
        'data'   => json_decode($body, true, 512, JSON_THROW_ON_ERROR),
    ];
}