【问题标题】:Magento Debug HEADERS ALREADY SENT errorMagento Debug HEADERS ALREADY SENT 错误
【发布时间】:2011-01-12 14:43:05
【问题描述】:

我在 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

我知道“标头已发送”是什么意思,但我不知道是什么文件导致了这种情况,并且跟踪并没有真正给我任何信息。

有没有办法找出有问题的文件?

谢谢!

【问题讨论】:

    标签: debugging magento header


    【解决方案1】:

    这是困难的方式。

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

    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,可能还有更多)

    【讨论】:

    • 这就是我想要的,谢谢。我将按照自己的方式完成列表,并在几年后尝试在这里报告。谢谢!
    • 致 Alan Storm,你能给我举个例子来复制这个警告吗?
    • 我尝试使用带有空格的 php 结束标签 ?> 但没有运气
    • 下面的方法好多了,应该是公认的答案
    【解决方案2】:

    这里有一个更简单的方法。

    查看文件中的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;
    }
    

    【讨论】:

    • 这仅记录 3 个空行:2011-01-13T09:59:41+00:00 EMERG (0):
    • 这不是Mage::log 的正确语法。我会把这归咎于艾伦累了,这当然不是他的典型。如果Mage::log使用多个参数,则第二个是错误级别,需要第三个来指示日志文件。你真正想要的是Mage::log("file: $file, line: $line")
    • @BrianVPS 感谢您的提醒——我确实在脑海中“DERP”了Mage::logvar_dump 的语法。帖子已更正。
    【解决方案3】:

    该错误是从 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 中。

    【讨论】:

    • 这是一个很好的答案,其中包含我追踪问题所需的详细信息。使用它来查找文件和@xyphoid 的答案以了解原因,我能够修复它。我不知道回应 Ajax 调用的响应是不好的。每天学习新东西:)
    【解决方案4】:

    在 Magento 中最常见的情况是直接从控制器输出内容时。

    而不是做

    echo $string; 
    

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

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

    【讨论】:

    • 在我们的例子中,罪魁祸首是Mage_Adminhtml_Cms_WysiwygController::directiveAction,它在不使用setBody的情况下(几乎)直接输出图像。
    • +1 不错!当我回显输出而不是 $this->getResponse()->setBody($string); 时,我得到了这个。我希望,我下次记得;)
    【解决方案5】:

    我也看到了。我认为这与所见即所得的图像有关。尝试在浏览管理员(尤其是 CMS 页面)时查看日志,您可能会看到它发生。它是无害的。

    【讨论】:

    • 感谢您的回复。这实际上发生在所有前端页面视图上。我的任务是获得一个干净的 system.log 文件!
    • 那么你应该在输出前开始寻找空白节奏
    • @clockworkgeek,我犯了同样的错误,但我想复制这个,我已经通过直接在块、控制器、结束标签和空格上回显完成,但尚未复制。如何复制此警告?你知道怎么做吗?
    • 在 CMS 页面的 WYSIWIG 编辑器中删除 html 元素之间的空格(如@Anton 建议的那样)消除了 OP 问题中的警告。注意:打开 CMS 页面的 WYSIWYG 编辑器似乎会插入空格。每次我在 CMS 中打开 WYSIWYG 编辑器(即使只是为了查看 html),我都必须确保删除空格...... Magento 的另一个令人讨厌的功能。
    【解决方案6】:

    也许它会对某人有所帮助: 当我在 CMS -> Pages 中编辑页面时打开 Magento 的 WYSIWYG 时收到类似的消息(我默认禁用 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>
    

    【讨论】:

      【解决方案7】:

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

      Best way to output ajax data from a Magento Admin Extension

      感谢@alan 回答我的问题。

      【讨论】:

        【解决方案8】:

        我认为这可能是OnePageCheckout 扩展问题。我在 Magento 中也有同样的错误,而且似乎这个错误不是很流行。我也安装了OnePageCheckout。但是,当然,这可能只是巧合。

        【讨论】:

          【解决方案9】:

          进行 Ajax 调用时遇到同样的问题

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

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

          【讨论】:

            【解决方案10】:

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

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

            在带有 PHP 5.6 的 xampp 中 output_buffering 默认启用。

            在带有 PHP 5.3 的 xampp 中 output_buffering 默认禁用。

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-12-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多