Как диагностировать сбой HEADERS ALREADY SENT?

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

16.10.2015 16:16

После установке сторонних модулей системный журнал var/log/system.log может содержать записи о сбоях вида: HEADERS ALREADY SENT.
При этом далее указан один и тот же стек вызовов, который не содержит информации о причине сбоя:
app/code/core/Mage/Core/Controller/Response/Http.php:52
[1] lib/Zend/Controller/Response/Abstract.php:771
[2] app/code/core/Mage/Core/Controller/Response/Http.php:84
[3] app/code/core/Mage/Core/Controller/Varien/Front.php:184
[4] app/code/core/Mage/Core/Model/App.php:365
[5] app/Mage.php:684
[6] index.php:84


Сложность диагностики такого сбоя является дефектом Magento 1.x.
Magento 1.x использует метод Zend_Controller_Response_Abstract::canSendHeaders() библиотеки Zend Framework с параметром $throw = false, что и приводит к утрате точки сбоя.
Для диагностики сбоя можно (временно) внести правки в указанный метод, поместив после строки
$ok = headers_sent($file, $line);

следующий код:
if ($ok) {
    Mage::log(array($file, $line));
}

таким образом, в системный журнал будет записана реальная точка сбоя (как правила, она расположена в неком некачественно написанном стороннем модуле).

Поделиться темой: