2017-06-22 41 views
0

私は、次のPHPの警告を見ていることにより、奇妙な問題を持っている:CakePHP 3 - コンテンツの長さのために警告が表示されますか?

Warning (512): Unable to emit headers. Headers sent in file=/vendor/cakephp/cakephp/src/Error/Debugger.php line=921 [CORE/src/Http/ResponseEmitter.php, line 48] 
Code Context 
Cake\Http\ResponseEmitter::emit() - CORE/src/Http/ResponseEmitter.php, line 48 
Cake\Http\Server::emit() - CORE/src/Http/Server.php, line 105 
[main] - ROOT/webroot/index.php, line 37 
Warning (2): Cannot modify header information - headers already sent by (output started at /vendor/cakephp/cakephp/src/Error/Debugger.php:921) [CORE/src/Http/ResponseEmitter.php, line 148] 
Code Context 
header - [internal], line ?? 
Cake\Http\ResponseEmitter::emitStatusLine() - CORE/src/Http/ResponseEmitter.php, line 148 
Cake\Http\ResponseEmitter::emit() - CORE/src/Http/ResponseEmitter.php, line 54 
Cake\Http\Server::emit() - CORE/src/Http/Server.php, line 105 
[main] - ROOT/webroot/index.php, line 37 
Warning (2): Cannot modify header information - headers already sent by (output started at /vendor/cakephp/cakephp/src/Error/Debugger.php:921) [CORE/src/Http/ResponseEmitter.php, line 181] 
Code Context 
header - [internal], line ?? 
Cake\Http\ResponseEmitter::emitHeaders() - CORE/src/Http/ResponseEmitter.php, line 181 
Cake\Http\ResponseEmitter::emit() - CORE/src/Http/ResponseEmitter.php, line 55 
Cake\Http\Server::emit() - CORE/src/Http/Server.php, line 105 
[main] - ROOT/webroot/index.php, line 37 

私は開発モード(app/config.php'DEBUG', true)にいますよ。私がそれをfalseに設定すると、警告が消えます。

エラーは、このコントローラのメソッドから発信されています。私は理解していない何

public function ajaxSubstances() 
{ 
    $this->autoRender = false; 
    $SubstanceModel = new SubstanceModel; 
    $data = ['data' => $SubstanceModel->getSubstances()]; 
    debug($data); 
} 

は私$data配列のみが含まれている場合は、20個の要素が言うことで、警告は表示されません。私が徐々に要素を追加するにつれて、一定数のレコード(約30以上の要素)があると、警告が常に表示されます。

ソースデータ(getSubstances())でないことを確認するには、$dataの配列をハードコードしましたが、同じことが起こります。

このメソッドはajaxレスポンスとして使用され、DataTableに渡されます。残念ながら、警告が出力された場合、有効な応答ではないため、DataTablesにエラーが表示されます。

debugfalseに切り替えることはできません。これは残りの開発のために必要なものです。とにかくこれが起こっているのはなぜですか?

は、私はヘッダータイプは、コード内の任意の場所に変更されていないため、「ヘッダを発する」しようとしている理由はわからない - それはdebug()を使用して、すべてを出力しています、と私はまた、var_dump()しようとしたが、出力はまだ同じtext/htmlですコンテンツタイプ。

答えて

1

エミッタが出力する前にデータが出力されるため、一般的にはコンテンツの長さに起因するわけではありませんが、応答エミッタが再生される前に送信されるバイトが1つでも発生します。 headers_sent()

あなたはおそらく唯一のとしての警告が表示さ

などクッキー、コンテンツの長さのように、応答に自分自身を適用している場合がありますもの以外に、発光する必要があり、さらにヘッダは、そこにある。なおPHPの出力バッファリングや圧縮(php.inioutput_bufferingzlib.output_compressionを参照)を使用しているため、特定の量のデータが必要です。バッファの記憶容量を超えている場合にはスクリプトの中で自動的にデータをフラッシュしますケースは通常4096バイトです)。

+0

感謝を参照してください。私が出力する必要があったデータはJSONフィードでなければなりませんでした。私はhttps://book.cakephp.org/3.0/en/views/json-and-xml-views.htmlに記載されているようにJSONビューを設定しました。これは役に立ちましたようです - コンテンツタイプヘッダーは適切に設定されています何の問題もなくデータを出力するか、それではこれまでのように思われます! – Andy

関連する問題