今回jsonを返すapiを用意した。前にこのブログでも記事を書いたことがある。
<?php ... echo json_encode([]); return; // returnはいらないけど、強制でactionの処理を終了したいときにあわせて使う
これでいいと思い実装していたのだが、↓のエラーがでてきた。
このエラーと
Unable to emit headers. Headers sent in file=... line=xxx
このエラーである。
Cannot modify header information - headers already sent by ${something php file name}.
発生源はここ
~/vendor/cakephp/cakephp/src/Http/ResponseEmitter.php
:42 line
<?php // ... public function emit(ResponseInterface $response, $maxBufferLength = 8192) { $file = $line = null; if (headers_sent($file, $line)) { $message = "Unable to emit headers. Headers sent in file=$file line=$line"; if (Configure::read('debug')) { trigger_error($message, E_USER_WARNING); } else { Log::warn($message); } } // ... } // ...
ふむ?すでにheaderに登録されているとな? よくわからん。
んで、最初jsonの形式がエラーなんだろ?と思っていたけど、どうやらjson_encode()
に渡すデータ量が増えるとそのエラーが発生するっぽい。
何故データの量が増えたら、headerに影響するかわからないが、検証したらそうだったので、なんか関係あるのでしょう。(・ω・`)
で、ずっとググっていたが、phpではよく発生しているっぽいけど、cakephpの記事すくなすぎー。
↑の記事のコードをみて、試してみたらビンゴだったので解決策を書く。
responseのオブジェクトにあるbody()
へ渡せばよい。
<?php $this->response->body(json_encode($data));
これでおk。エラーは綺麗サッパリなくなりましたとさ。