6

$config['compress_output'] = trueCodeIgniterでこの「コンテンツ エンコーディング エラー」を引き起こすリークの場所を特定する方法を知っている人はいますか?

このエラーを何日もデバッグしようとしましたが、リークがどこにあるかを見つけることができないようです. LogLevelですがdebug、このエラーが発生したときにログに情報が表示されません。

それで、これをデバッグする方法はありますか?

アップデート

この機能を無効にしたくありませんcompress_output。エラーが発生した場所を追跡する方法を知りたいだけです。

更新2

コントローラーに出力があるかどうかを確認するために何度も何度も調べました...出力がないため、他の場所でエラーが発生している必要があります。モデル/データベースなし、コントローラー、ライブラリ、ヘルパー、ビューのみ

4

7 に答える 7

18

この問題は、出力バッファリングが開始される場所です。config 変数のチェックは にsystem/core/Output.phpあり_display()ます。多くのコードが既に実行された後、gzip されたバッファリングを開始します。これにより、バッファリングが開始される前に出力が発生する可能性が残ります。

何もエンコードされていないため、compress_output設定しても問題ありません。false設定するtrueと、混合コンテンツになります。一部の出力はエンコードされており、一部はエンコードされていないため、圧縮エラーが発生します。

次の 2 つの解決策があります。

1) compress_outputfalse に設定したままob_start('ob_gzhandler');にして、index.php ファイルの先頭に追加することができます。これにより、エラーを含め、すべての出力が常に gzip されます。

2) 他の解決策は、 in のob_flush();前に追加することです。これにより、エラーがない場合は出力が gzip され、エラーがある場合はエンコードされていないコンテンツが提供されます。ob_start('ob_gzhandler');system/Output.php

2 がより良い解決策であり、CodeIgniter チームによって実装されるべきだと思います。ただし、システム コードをいじりたくない場合 (アップグレードすると変更はなくなります)、1 の方が適切なソリューションです。

于 2012-06-13T01:27:29.767 に答える
2

次の行を config.php に追加します。

$config['compress_output'] = FALSE;

解決します。FILLCATEGORIAS私の場合の問題は、投稿を送信したことですが、機能が認識されませんでした。Inly を変更することで$ 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>

于 2016-05-04T05:01:02.943 に答える
2

これは一筋縄ではいかないかもしれませんが、データベース出力をモデルに送信するのではなく、コントローラから直接エコー/印刷すると、出力バッファリングに関係するエラー メッセージが表示される可能性があります。コントローラーから反響していますか?

于 2012-06-15T18:15:23.813 に答える
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')(Output.phpの379行目)が実行されるため、「ヘッダー情報を変更できません-ヘッダーは既に送信されています...」という警告が表示されるために発生します。この警告は、圧縮エラーの原因です。

したがって、基本的に、Outputクラス(json出力を含む)の外部のエコーはクライアントにヘッダーを送信します。これにより、「ヘッダー情報を変更できません-ヘッダーは既に送信されています...」という警告が表示され、「コンテンツエンコーディングエラー」が発生します。

于 2012-06-16T00:26:12.917 に答える
1

私も同じ問題を抱えていました。検索したところ、コントローラー?>のファイルの終わりにあることがわかりました。だから私はそれを削除しました、そしてそれは完全に動作します。詳細については、こちらのリンクをご覧ください。

于 2012-12-31T05:24:06.340 に答える
0

より準拠したソリューション:

$this->output->set_output($data);
于 2020-01-24T11:08:56.490 に答える