我遇到了一个奇怪的问题,我看到以下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
内容类型。
答案 0 :(得分:1)
这不一定是由于内容的长度,但通常是由于在发射器输出报头之前输出数据,所以即使在响应发射器之前发送单个字节也会发生这种情况。发挥作用,明确测试headers_sent()
。
请注意,除了您自己应用于响应的那些标题之外,还可能需要发出更多标题,例如Cookie,内容长度等。
您很可能只看到一定数量的数据警告,因为您正在使用PHP输出缓冲和/或压缩(请参阅output_buffering
中的zlib.output_compression
和php.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中发送了错误