CodeIgniter "ошибка кодирования содержимого"

Кто-нибудь знает, как найти утечку, которая вызывает эту «ошибку кодирования содержимого» с помощью $config['compress_output'] = true в CodeIgniter?

Я пытаюсь отладить эту ошибку в течение нескольких дней, но я не могу найти, где находится утечка. LogLevel debug но я не вижу никакой информации в журнале при возникновении этой ошибки.

Итак, любые идеи, как отлаживать это?

ОБНОВИТЬ

Я действительно не хочу отключать функцию compress_output , я просто хочу посмотреть, как я могу отслеживать, где возникает ошибка

UPDATE2

Я снова и снова просматривал, чтобы увидеть, есть ли какие-либо выходные данные в контроллерах … и их нет, поэтому некоторые из них должны быть вызваны ошибкой. Нет моделей / базы данных, просто контроллеров, библиотек, помощников и просмотров

Эта проблема начинается с буферизации вывода. Проверка переменной конфигурации находится в system/core/Output.php в _display() . Он запускает буферизацию gzipped после того, как много кода уже запущено. Это приводит к тому, что выход будет происходить до начала буферизации.

Если параметр compress_output равен false это не имеет значения, потому что ничего не закодировано. С его значением true вы получаете смешанный контент. Некоторый вывод кодируется, а некоторые не приводят к ошибке сжатия.

Существует два решения:

1) Вы можете оставить параметр compress_output ob_start('ob_gzhandler'); false и добавить ob_start('ob_gzhandler'); вверху вашего файла index.php. Это гарантирует, что все выходные данные всегда будут сжаты, включая ошибки.

2) Другое решение – добавить ob_flush(); перед ob_start('ob_gzhandler'); в system/Output.php . Это будет выводить gzip, когда ошибок нет, и обслуживать вас в незакодированном виде, когда есть ошибки.

Я думаю, что 2 – лучшее решение и должно быть реализовано командой CodeIgniter. Но если вы не хотите гадоваться с системным кодом (изменения будут уходить при обновлении), то 1 – лучшее решение для вас.

  1. Любая ошибка в PHP нарушит сжатие.

    Чтобы проверить это, в index.php измените:

     error_reporting(E_ALL); 

    в

     error_reporting(E_ALL ^ E_NOTICE); 
  2. Не эхо / печать для вывода на выходе контроллера.

  3. Не используйте «?>» В конце файла контроллера.

Я надеюсь, что это помогает.

Обновить:

Чтобы проверить, пуст ли пуст до начала буферизации, вы можете открыть core / Output.php и добавить

 ob_flush(); 

до

 ob_start('ob_gzhandler'); 

Если есть даже пробел или пустая строка, сжатие завершится неудачно. ( проверьте источник страницы из браузера ). Это происходит потому, что с $ config ['compress_output'] = true выполняется ob_start ('ob_gzhandler') (строка 379 в Output.php), что приведет к предупреждению « Невозможно изменить информацию заголовка – Заголовки уже отправлены … ». Это предупреждение является причиной отказа сжатия.

Таким образом, любое эхо вне класса Output ( включая json-выход ) отправляет заголовки клиенту, что приведет к предупреждению « Невозможно изменить информацию заголовка – Заголовки уже отправлены … », что вызовет « ошибку кодирования содержимого ».

У меня такая же проблема. После поиска я обнаружил, что мой контроллер имеет ?> конце файла. Поэтому я удалил его, и он отлично работает. Вот ссылка для более подробной информации.

Поместив следующую строку в config.php:

 $config['compress_output'] = FALSE; 

Решает. Проблема в моем случае состояла в том, что я отправил сообщение, но он не признал функцию FILLCATEGORIAS . Всем путем изменения $ config [ 'compress_output'] = FALSE; решил это.

ЭТА проблема возникла, когда мы отправляем данные с помощью запроса POST:

Не удалось загрузить ресурс: net :: ERR_CONTENT_DECODING_FAILED

 <script type="text/javascript"> $(document).ready(function() { $("#idEmpresa").change(function() { $("#idEmpresa option:selected").each(function() { id = $('#idEmpresa').val(); $.post("<?php echo base_url();?>Admin/fillCategorias", { idEmpresa : id }, function(data) { $("#idCategoria").html(data); }); }); }); }); </script> 

Это может быть длинный снимок, но если вы эхо / печатаете базу данных напрямую с вашего контроллера, а не отправляете его в модель, вы, скорее всего, получите сообщения об ошибках, связанные с буферизацией вывода. Вы эхом отзываетесь от своего контроллера?