Расшифровать сжатую веб-страницу, полученную через cURL, в PHP

Я получаю сжатую веб-страницу с помощью curl, но когда я выводю полученный контент в браузер, я получаю только необработанные сжатые данные. Как я могу расшифровать данные в PHP?

Я нашел один метод - записать содержимое в файл tmp, а затем ...

$f = gzopen($filename,"r");
$content = gzread($filename,250000);
gzclose($f);

.... но, чувак, должен быть способ получше.

Обновлено: это не файл, а сжатая html-страница, возвращаемая веб-сервером.

Сжат ли сам файл с помощью gzip или сервер сжимает его для передачи?

Artelius 22.11.2008 04:05

Можете ли вы вместо декодирования данных gzip просто отправить правильные заголовки, чтобы браузер правильно их распознал? Или, если вы не хотите, чтобы он был сжат с помощью gzip, скажите cURL, чтобы он не запрашивал сжатые данные, установив для CURLOPT_ENCODING значение "identity".

nobody 22.11.2008 04:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
56
2
46 287
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я использую завиток и:

curl_setopt($ch,CURLOPT_ENCODING , "gzip");

Просто отметим, что эта опция устанавливает заголовок Accept-Encoding: gzip в запросе. и распаковывает ответ, если он сжат (это может быть не так), так что это действительно все, что вам нужно сделать.

Synchro 04.06.2013 12:07

Идеальное решение для CURL.

The Onin 20.10.2016 22:00

Установка его на 'gzip' приведет к тому, что всегда отправит Accept-Encoding: gzip, даже если ваша версия PHP не поддерживает декодирование gzip (тогда вы получите сжатые данные). Если вы установите его на '' (пустая строка), curl автоматически объявит и декодирует все кодировки, которые он поддерживает.

AndreKR 01.02.2017 09:46

Универсальная функция GUNZIP:

   function gunzip($zipped) {
      $offset = 0;
      if (substr($zipped,0,2) == "\x1f\x8b")
         $offset = 2;
      if (substr($zipped,$offset,1) == "\x08")  {
         # file_put_contents("tmp.gz", substr($zipped, $offset - 2));
         return gzinflate(substr($zipped, $offset + 8));
      }
      return "Unknown Format";
   }  

Пример интеграции функции с CURL:

      $headers_enabled = 1;
      curl_setopt($c, CURLOPT_HEADER,  $headers_enabled)
      $ret = curl_exec($c);

      if ($headers_enabled) {
         # file_put_contents("preungzip.html", $ret);

         $sections = explode("\x0d\x0a\x0d\x0a", $ret, 2);
         while (!strncmp($sections[1], 'HTTP/', 5)) {
            $sections = explode("\x0d\x0a\x0d\x0a", $sections[1], 2);
         }
         $headers = $sections[0];
         $data = $sections[1];

         if (preg_match('/^Content-Encoding: gzip/mi', $headers)) {
            printf("gzip header found\n");
            return gunzip($data);
         }
      }

      return $ret;

Другие вопросы по теме