Magento Debug HEADERS ALREADY SENT错误

时间:2011-01-12 14:43:05

标签: debugging magento header

我在system.log文件中收到以下错误:

 2011-01-12T14:16:52+00:00 DEBUG (7): HEADERS ALREADY SENT: 
 [0] C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Controller\Response\Http.php:44
 [1] C:\xampp\htdocs\www.mysite.com\lib\Zend\Controller\Response\Abstract.php:727
 [2] C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Controller\Response\Http.php:75
 [3] C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Controller\Varien\Front.php:188
 [4] C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Model\App.php:304
 [5] C:\xampp\htdocs\www.mysite.com\app\Mage.php:596
 [6] C:\xampp\htdocs\www.mysite.com\index.php:81

我知道“已经发送的标题”意味着什么,但我不知道是什么文件导致了这个并且跟踪并没有真正给我任何信息。

有没有找到违规文件的方法?

谢谢!

11 个答案:

答案 0 :(得分:16)

这是艰难的方式。

在文件中查找正在进行记录的位置

C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Controller\Response\Http.php 
Mage::log('HEADERS ALREADY SENT: '.mageDebugBacktrace(true, true, true));

添加日志记录以获取到目前为止所包含/需要的每个文件的副本

Mage::log(print_r(get_included_files(),true));

如果您记得将文件恢复到预处理条件,或者您可以在

添加临时副本,则可以将此日志记录直接添加到核心文件中
app/code/local/Mage/Core/Controller/Response/Http.php

只要你记得在完成后删除它(或者只是使用git)。

检查通常的空白区域嫌疑人的文件列表,然后检查它们是否有可能产生输出的任何函数(echoprintreadfile,可能还有更多)

答案 1 :(得分:15)

这是一种更简单的方法。

查看文件

中的canSendHeaders方法
lib/Zend/Controller/Response/Abstract.php

添加一些日志记录到

public function canSendHeaders($throw = false)
{
    $ok = headers_sent($file, $line);
    // to get PHP's report on which file is sending a header.
    if ($ok !== false){
        Mage::log('File: ' . $file, null, 'exception.log', true);
        Mage::log('Line: ' . $line, null, 'exception.log', true);
    }

    if ($ok && $throw && $this->headersSentThrowsException) {
        #require_once 'Zend/Controller/Response/Exception.php';
        throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line);
    }

    return !$ok;
}

答案 2 :(得分:9)

从Mage_Core_Controller_Response_Http - >抛出该错误sendHeaders()。该函数调用实际进行检查的超类函数,以查看是否已经发送了标题,Zend_Controller_Response_Abstract - > canSendHeaders()。

Zend_Controller_Response_Abstract类处理(其中包括)发送响应头并跟踪上次发送头(以及从哪个文件和行)。这是函数的样子,我们将在第316行到lib \ Zend \ Controller \ Response \ Abstract.php进行更改:

public function canSendHeaders($throw = false) {
    $ok = headers_sent($file, $line);
    if ($ok && $throw && $this->headersSentThrowsException) {
        #require_once 'Zend/Controller/Response/Exception.php';
        throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line);
    }
    return !$ok;
}

要:

public function canSendHeaders($throw = false)
{
    $ok = headers_sent($file, $line);

    if ($ok) {
        Mage::log('Cannot send headers; headers already sent in ' . $file . ', line ' . $line, null, 'headers.log');
    }

    return !$ok;

    #if ($ok && $throw && $this->headersSentThrowsException) {
    #    #require_once 'Zend/Controller/Response/Exception.php';
    #    throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line);
    #}
    #return !$ok;
}

这将在/var/log/header.log中记录错误。

答案 3 :(得分:8)

您在Magento中遇到的最常见的地方是直接从控制器输出内容。

而不是做

echo $string; 

在控制器内,执行以下操作:

$this->getResponse()->setBody($string);

答案 4 :(得分:5)

我也看到了这一点。我认为它与WYSIWYG中的图像有关。尝试通过管理员(特别是CMS页面)观察日志,您可能会看到它发生。这是无害的。

答案 5 :(得分:3)

也许对某人有帮助: 当我在CMS中编辑页面时打开Magento的WYSIWYG时,我收到类似的消息 - >页面(我默认禁用所见即所得,所以我必须单击“显示/隐藏编辑器”才能启用它)。如果页面包含CMS标记,例如:

{{store url='my-other-page'}}
单击“显示/隐藏编辑器”后,

此消息在system.log中出现:

2013-04-06T11:10:38+00:00 DEBUG (7): HEADERS ALREADY SENT: <pre>[0] ...\app\code\core\Mage\Core\Controller\Response\Http.php:52
[1] ...\lib\Zend\Controller\Response\Abstract.php:766
[2] ...\app\code\core\Mage\Core\Controller\Response\Http.php:83
[3] ...\app\code\core\Mage\Core\Controller\Varien\Front.php:188
[4] ...\app\code\core\Mage\Core\Model\App.php:354
[5] ...\app\Mage.php:683
[6] ...\index.php:87
</pre>

答案 6 :(得分:0)

当我以“hacky”方式构建Ajax请求时,我收到此错误,直接回显内容而不是通过布局发送它们。一旦我通过布局将它们发送出去,错误就消失了。在这里看到我自己的问题:

Best way to output ajax data from a Magento Admin Extension

支持@alan回答我的问题。

答案 7 :(得分:0)

我认为这可能是OnePageCheckout扩展问题。我在Magento中有同样的错误,似乎这个错误并不那么受欢迎。我也安装了OnePageCheckout。但是,当然,这可能只是巧合。

答案 8 :(得分:0)

进行Ajax调用时的相同问题

当我正在进行Ajax调用并直接从控制器调用模板时,我收到了日志。

当我更改代码并在布局xml文件中创建块时。日志错误得到修复。

答案 9 :(得分:0)

安装Magento时遇到同样的问题。

在我的案例中,在PHP中启用 output_buffering 解决了这个问题。

在xampp中使用PHP 5.6 output_buffering 默认启用。

在使用PHP 5.3的xampp中,默认情况下禁用 output_buffering

答案 10 :(得分:0)

在我们的案例中,这是Magento CE 1.9.2.4中的一个错误,该错误在Magento CE 1.9.3中得到修复,在使用WYSIWYG图像时发生。我们只做了一个小扩展,它覆盖了\ app \ code \ core \ Mage \ Adminhtml \ controllers \ Cms \ WysiwygController.php中的函数directiveAction()。有关详细信息,请参阅(德语)here