Кто-нибудь знает, как найти утечку, которая вызывает эту «ошибку кодирования содержимого» с помощью $config['compress_output'] = true
в CodeIgniter?
Я пытаюсь отладить эту ошибку в течение нескольких дней, но я не могу найти, где находится утечка. LogLevel
debug
но я не вижу никакой информации в журнале при возникновении этой ошибки.
Итак, любые идеи, как отлаживать это?
Я действительно не хочу отключать функцию compress_output
, я просто хочу посмотреть, как я могу отслеживать, где возникает ошибка
Я снова и снова просматривал, чтобы увидеть, есть ли какие-либо выходные данные в контроллерах … и их нет, поэтому некоторые из них должны быть вызваны ошибкой. Нет моделей / базы данных, просто контроллеров, библиотек, помощников и просмотров
Эта проблема начинается с буферизации вывода. Проверка переменной конфигурации находится в 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 – лучшее решение для вас.
Любая ошибка в PHP нарушит сжатие.
Чтобы проверить это, в index.php измените:
error_reporting(E_ALL);
в
error_reporting(E_ALL ^ E_NOTICE);
Не эхо / печать для вывода на выходе контроллера.
Не используйте «?>» В конце файла контроллера.
Я надеюсь, что это помогает.
Обновить:
Чтобы проверить, пуст ли пуст до начала буферизации, вы можете открыть 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>
Это может быть длинный снимок, но если вы эхо / печатаете базу данных напрямую с вашего контроллера, а не отправляете его в модель, вы, скорее всего, получите сообщения об ошибках, связанные с буферизацией вывода. Вы эхом отзываетесь от своего контроллера?