CakePHP 3 - 由于内容的长度而显示警告?

时间:2017-06-22 15:51:21

标签: cakephp cakephp-3.0

我遇到了一个奇怪的问题,我看到以下PHP警告:

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

我处于开发模式('DEBUG', true中的app/config.php)。如果我将其设置为false警告将按预期消失。

错误源自此Controller方法:

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

我不明白的是,如果我的$data数组只包含20个元素,则不显示警告。随着我逐渐添加更多元素,一旦有一定数量的记录(约> = 30个元素),它总是显示警告。

要检查它不是源数据(来自getSubstances()),我将$data数组硬编码,但同样的事情发生了。

此方法将用作ajax响应并送入DataTables。不幸的是,如果输出警告,DataTables将显示错误,因为它不是有效的响应。

我无法将debug切换为false因为我需要将其用于其余的开发。而且我想知道为什么会发生这种情况呢?

我不确定为什么它会尝试“发出标题”,因为代码中的标题类型没有被更改 - 它使用debug()输出所有内容,我也尝试var_dump()但是输出仍然是text/html内容类型。

3 个答案:

答案 0 :(得分:1)

这不一定是由于内容的长度,但通常是由于在发射器输出报头之前输出数据,所以即使在响应发射器之前发送单个字节也会发生这种情况。发挥作用,明确测试headers_sent()

请注意,除了您自己应用于响应的那些标题之外,还可能需要发出更多标题,例如Cookie,内容长度等。

您很可能只看到一定数量的数据警告,因为您正在使用PHP输出缓冲和/或压缩(请参阅output_buffering中的zlib.output_compressionphp.ini }),只有在超出缓冲存储能力的情况下才会自动刷新脚本中的数据(在大多数情况下,通常为4096字节)。

另见

答案 1 :(得分:0)

对于使用 JavaScript 的用户,在客户端接收ajax呼叫响应而不是响应[“responsText”] 时,请使用 [“responseJSON”] 即可。

调用 JSON.parse(response [“responseText”])会失败,因为在cakePHP调试模式中,html中的警告/错误会在“responsText”中的实际json结果之前追加< / strong>当结果太长时。

 $.ajax({
        type: "get",
        url: "/projects/someMethod",
        async: true,
        data: requestParams,
        complete: function (resp) {
            try {
                //instead of var = JSON.parse(resp["responseText"]) use 
                var responseData = resp["responseJSON"];
            } catch (e) {
                console.log(e.message);
            }
        }
    });

在cakePHP'服务器端,您可以像这样实现 someMethod (无需创建视图):

public function someMethod()
{
    if($this->request->is('ajax'))
    {
        $this->autoRender = false;

        //some $returnData  assigment

        $this->response->body(json_encode($returnData));
        $this->response->type('json');

        return $this->response;
    }
}

答案 2 :(得分:0)

如果已放置,则发出调试语句。因为服务器认为它回显并显示消息,这导致标头已经在较低版本的php7.0之类的php7.0中发送了错误