読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。PythonとRを使って仕事しています。最近は機械学習をさわりはじめたお(^ω^ = ^ω^)

【CakePHP3.x】Unable to emit headers. Headers sent in file=... line=xxx

スポンサードリンク

今回jsonを返すapiを用意した。前にこのブログでも記事を書いたことがある。

www.aipacommander.com

<?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の記事すくなすぎー。

stackoverflow.com

↑の記事のコードをみて、試してみたらビンゴだったので解決策を書く。

responseのオブジェクトにあるbody()へ渡せばよい。

<?php
$this->response->body(json_encode($data));

これでおk。エラーは綺麗サッパリなくなりましたとさ。