是否有人知道如何找到在CodeIgniter中引发$config['compress_output'] = true
"内容编码错误"的泄漏位置?
几天来我一直在尝试调试此错误,但我似乎找不到泄漏的位置。 LogLevel
在debug
,但是发生此错误时,我在日志中看不到任何信息。
那么,有什么想法可以调试吗?
更新
我真的不想禁用compress_output
功能,我只想看看如何跟踪产生错误的位置
UPDATE2
我一遍又一遍地查看控制器中是否有任何输出......而且没有,所以有些其他地方一定是挑起的错误。没有模型/数据库,只有控制器、库、帮助程序和视图
此问题是输出缓冲开始的地方。对配置变量的检查在 _display()
中system/core/Output.php
。它在大量代码已经运行后启动 gzip 缓冲。这使得输出有可能在缓冲开始之前发生。
将compress_output
设置为 false
这并不重要,因为不会对任何内容进行编码。将其设置为true
您最终会得到混合内容。有些输出是编码的,有些不是,这会导致压缩错误。
有两种解决方案:
1)您可以将compress_output
设置为 false,并将ob_start('ob_gzhandler');
添加到索引.php文件的顶部。这将确保始终对所有输出进行 gzip 压缩,包括错误。
2)另一种解决方案是在system/Output.php
ob_start('ob_gzhandler');
之前添加ob_flush();
。这将在没有错误时 gzip 输出,并在出现错误时为您提供未编码的内容。
我认为 2 是更好的解决方案,应该由 CodeIgniter 团队实现。但是,如果您不想弄乱系统代码(升级时更改会消失),那么 1 是您更好的解决方案。
这可能是一个很长的机会,但如果您直接从控制器回显/打印数据库输出,而不是将其发送到模型,您可能会收到与输出缓冲相关的错误消息。您是否正在从控制器发出回声?
将以下行放入 config.php:
$config['compress_output'] = FALSE;
解决了它。就我而言,问题是我发送了帖子,但它无法识别FILLCATEGORIAS
功能。Inly通过改变$ config [ 'compress_output'] = FALSE;
解决了它。
当我们使用 POST 请求发送数据时,会出现此问题:
无法加载资源:净::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>
-
PHP 中的任何错误都会破坏压缩。
为了测试这一点,在索引中.php更改:
error_reporting(E_ALL);
自
error_reporting(E_ALL ^ E_NOTICE);
-
不要回显/打印以显示控制器的输出。
-
不要在控制器文件的末尾使用"?>"。
我希望它有所帮助。
更新:
要在开始缓冲之前检查输出是否为空,您可以打开内核/输出.php并添加
ob_flush();
以前
ob_start('ob_gzhandler');
即使有空格或空行,压缩也会失败。(从浏览器检查页面源代码)。发生这种情况是因为执行 $config['compress_output'] = true 时,执行 ob_start('ob_gzhandler')(输出.php中的第 379 行),这将导致"无法修改标头信息 - 标头已发送..."警告。此警告是压缩失败的原因。
所以基本上,输出类(包括json输出)之外的任何回显都会将标头发送到客户端,这将导致"无法修改标头信息 - 标头已发送..."警告,这将导致"内容编码错误"。
我遇到了同样的问题。搜索后,我发现我的控制器在文件末尾有?>
。所以我删除了它,它工作得很好。这是更多详细信息的链接。
更合规的解决方案:
$this->output->set_output($data);
某些 CPanel 光速扩展更新会产生此问题。您可以尝试在.htaccess
文件中添加此代码:
php_flag zlib.output_compression ON