Тебе нужно пихнуть куда-то JSON, но сервер требует gzip. PHP умеет, но официальная документация пишет так, будто ты защищаешь диссертацию. Ниже — простой рабочий пример с curl и gzencode().

Иногда API не принимает «толстые» запросы и просит всё жать gzip. Это нормальная практика: экономим трафик и ускоряем обработку. В PHP задача решается в лоб: берём Curl, жмём gzencode, вешаем правильные заголовки. Звучит просто, но есть нюанс: если забудешь поставить Content-Encoding: gzip — сервер будет читать мусор.

Пример кода

<?php

function sendCompressedData($url, array $data)
{
    $json = json_encode($data, JSON_UNESCAPED_UNICODE);

    // Сжимаем данные
    $compressed = gzencode($json);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Content-Encoding: gzip',
            'Accept-Encoding: gzip',
        ],
        CURLOPT_POSTFIELDS     => $compressed,
    ]);

    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        throw new RuntimeException('Curl error: ' . curl_error($ch));
    }

    curl_close($ch);

    return $response;
}

// пример использования $url  = "https://example.com/api";
$data = ['foo' => 'bar', 'id' => 42];

$response = sendCompressedData($url, $data);
echo $response;

Что тут происходит

  • json_encode() — готовим тело запроса.
  • gzencode() — жмём его в gzip.
  • CURLOPT_HTTPHEADER — без Content-Encoding: gzip сервер решит, что мы сошли с ума.
  • Accept-Encoding: gzip — чтобы и ответ прилетел сжатым (если API умеет).

Ошибки Curl — ловим руками, иначе будешь гадать, почему API молчит.

Подводные камни

  • nginx/Apache могут резать gzip. Иногда прокси-сервер разворачивает тело запроса. Смотри в логи.
  • Сжатие не всегда нужно. Если твой JSON на 200 байт — gzip только добавит накладные расходы.
  • Ответ тоже может прийти gzipped. Тогда тебе придётся распаковать его через gzdecode($response).

Итог

Вся магия — это одна строчка с gzencode(). Дальше всё стандартно: Curl, заголовки и проверка ошибок.