Заголовки отладки Magento УЖЕ ОТПРАВЛЕНЫ ошибка

В моем файле 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

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

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

Спасибо!


person sulman    schedule 12.01.2011    source источник


Ответы (11)


Вот трудный путь.

Найдите место в файле, в котором ведется запись.

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, возможно, есть и другие)

person Alan Storm    schedule 12.01.2011
comment
Это то, что я искал, спасибо. Я собираюсь пройтись по списку и постараюсь доложить здесь через несколько лет, когда закончу. Спасибо! - person sulman; 13.01.2011
comment
Алану Сторму, не могли бы вы дать мне пример для воспроизведения этого предупреждения? - person Josua Marcel C; 14.09.2012
comment
Я пробовал использовать закрывающий тег php с пустыми пробелами на нем ?> , но не повезло - person Josua Marcel C; 17.09.2012
comment
метод ниже намного лучше, это должен быть принятый ответ - person WonderLand; 11.05.2016

Вот способ попроще.

Посмотрите на метод 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;
}
person Alan Storm    schedule 12.01.2011
comment
Это просто регистрирует 3 пустые строки: 2011-01-13T09: 59: 41 + 00: 00 EMERG (0): - person sulman; 13.01.2011
comment
Это неправильный синтаксис для Mage::log. Я спишу это на то, что Алан устал, это, конечно, не типично для него. Если вы используете более 1 параметра для Mage::log, второй - это уровень ошибки, а третий вам нужен для указания файла журнала. Вот что вам действительно нужно Mage::log("file: $file, line: $line") - person BrianVPS; 20.04.2015
comment
@BrianVPS Спасибо за внимание - я действительно использовал DERP для синтаксиса Mage::log и var_dump в своей голове. Пост исправлен. - person Alan Storm; 21.04.2015

Эта ошибка возникает из 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.

person egeelabs    schedule 06.03.2014
comment
Это отличный ответ с той детализацией, которая мне нужна, чтобы отследить мою проблему. Используя это, чтобы найти файл и ответ @xyphoid, чтобы понять, почему, я смог это исправить. Я понятия не имел, что повторять ответ от вызова Ajax было плохо. Узнавайте что-то новое каждый день :) - person BrianVPS; 20.04.2015

Чаще всего вы сталкиваетесь с этим в Magento, когда вы выводите контент непосредственно из контроллера.

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

echo $string; 

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

$this->getResponse()->setBody($string);
person xyphoid    schedule 16.07.2013
comment
В нашем случае виновником является Mage_Adminhtml_Cms_WysiwygController::directiveAction, который выводит изображение (почти) прямо без использования setBody. - person jlilja; 08.12.2015
comment
+1 Приятно! Я получил это, когда отображал вывод вместо $this->getResponse()->setBody($string);. Надеюсь, вспомню в следующий раз;) - person Damodar Bashyal; 21.11.2016

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

person clockworkgeek    schedule 12.01.2011
comment
Спасибо за ответ. Однако на самом деле это происходит при просмотре всех страниц переднего плана. Я хочу получить чистый файл system.log! - person sulman; 12.01.2011
comment
тогда вы должны начать искать белые шаги перед выходом - person Anton S; 12.01.2011
comment
@clockworkgeek, я сделал ту же ошибку, но я хочу повторить это, я сделал эхо непосредственно на блоке, контроллере, закрывающих тегах и пробелах, но еще не реплицирован. как воспроизвести это предупреждение? ты знаешь, как это сделать? - person Josua Marcel C; 18.09.2012
comment
Удаление пробелов между элементами html (как предложил @Anton) в редакторе WYSIWIG для страниц CMS избавило от предупреждения в вопросе OP. Примечание: при открытии редактора WYSIWYG для страниц CMS кажется, что вставляются пробелы. Каждый раз, когда я открывал редактор WYSIWYG в CMS (даже если просто просматривал html), мне приходилось удалять пробелы ... еще одна неприятная особенность Magento. - person Vee; 30.07.2015

Может быть, это будет полезно для кого-то: я получаю подобное сообщение, когда включаю WYSIWYG Magento при редактировании страниц в CMS -> Страницы (у меня 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>
person zitix    schedule 06.04.2013

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

Лучший способ вывода данных ajax от администратора Magento Расширение

Реквизит @alan за его ответ на мой вопрос.

person Chris    schedule 12.01.2011

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

person zzza    schedule 29.04.2012

Та же проблема при выполнении вызова Ajax

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

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

person Deepak Mallah    schedule 22.02.2014

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

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

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

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

person Frank Rochlitzer    schedule 21.06.2016

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

person Bastian Kretzschmar    schedule 16.02.2018