Ошибка Magento Debug HEADERS AREADY SENT

Я получаю следующую ошибку в файле 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

Я знаю, что означает "заголовки, уже отправленные", но я не знаю, какой файл вызывает это, и трассировка не дает мне никакой информации.

Есть ли способ узнать оскорбительный файл?

Спасибо!

Ответ 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).

Проверьте этот список файлов для обычных подозрительных лиц белого пространства, а затем проверьте их на любые функции, которые могли бы выдавать выходные данные (echo, print, readfile, возможно, больше)

Ответ 2

Здесь более простой способ.

Посмотрите на метод canSendHeaders в файле

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);
    }
    // to get PHP report on which file is sending a header.
    if ($ok){
        Mage::log('File: ' . $file);
        Mage::log('Line: ' . $line);
    }

    return !$ok;
}

Ответ 3

Наиболее распространенное место, которое вы используете в Magento, - это когда вы выводите контент непосредственно из контроллера.

Вместо того, чтобы делать

echo $string; 

внутри контроллера, сделайте следующее:

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

Ответ 4

Эта ошибка выбрана из 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;
}

To:

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.

http://codegento.com/2011/03/debugging-headers-already-sent-error/

Ответ 5

Я тоже это вижу. Я думаю, что это имеет какое-то отношение к изображениям в WYSIWYG. Попробуйте просмотреть журналы, проходя через админ (особенно страницы CMS), и вы можете увидеть, как это происходит. Это безвредно.

Ответ 6

Может быть, кому-то это будет полезно: Я получаю подобное сообщение, когда включаю Magento WYSIWYG при редактировании страниц в CMS → Pages (по умолчанию у меня отключен WYSIWYG, поэтому я должен нажать "Show/Hide Editor", чтобы включить его). Если на странице есть теги CMS, например:

{{store url='my-other-page'}}

это сообщение появляется в system.log после нажатия "Show/Hide Editor":

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

Я получил эту ошибку, когда я построил свой запрос Ajax "взломанным" способом, повторив содержимое напрямую, а не отправляя их через макет. Как только я отправил их через макет, ошибки исчезли. См. Мой собственный вопрос здесь:

Лучший способ вывода данных ajax из Magento Admin Extension

реквизит для @alan для ответа на мой вопрос.

Ответ 8

Я думаю, что это может быть проблема с расширением OnePageCheckout. У меня такая же ошибка в Magento, и кажется, что эта ошибка не так популярна. Также у меня установлен OnePageCheckout. Но, конечно, это может быть просто совпадение.

Ответ 9

Одинаковая проблема при создании вызова Ajax

Я получал журнал, когда делал вызов Ajax и вызывал шаблон непосредственно с контроллера.

Когда я изменил код и создал блок в XML файле макета. ошибка журнала была исправлена.

Ответ 10

У меня такая же проблема при установке Magento.

В моем случае включение output_buffering в PHP решило проблему.

В xampp с PHP 5.6 output_buffering включен по умолчанию.

В xampp с PHP 5.3 output_buffering по умолчанию отключен.

Ответ 11

В нашем случае это была ошибка в Magento CE 1.9.2.4, которая была исправлена ​​в Magento CE 1.9.3, которая произошла при использовании WYSIWYG с изображениями. Мы просто сделали небольшое расширение, которое перезаписывает функцию directiveAction() в \app\code\core\Mage\Adminhtml\controllers\Cms\WysiwygController.php. Для получения дополнительной информации см. (На немецком языке) здесь.