Ошибка с буферизацией вывода и FirePHP

Я получаю необъяснимую ошибку "Заголовки уже отправлены в строке #..." в тех двух строках, которые выполняют "echo..." в приведенном ниже коде.

Упрощенный вариант дела:

<?php
ob_start();

//Initializing FirePHP...
include_once(F_FS_PATH."lib/FirePHPCore/fb.php");
// <--- I've also tried to move the ob_start(), after the FirePHP init,
// <--- instead before it. But it made no difference.
?>
<html>
<div>A lots of HTML (and php) code goes here... Actually my entire page.
FirePHP is also used here many times by multiple invocations
of the function fb('debug text');</div>
</html>

<?php
$all_page_content=ob_get_clean();

if ($GLOBALS["marketing_enabled"])
    echo marketingReplaceContent($all_page_content);
else
    echo $all_page_content;

ob_flush(); flush();

//Do some other non-printing - but slow stuff.
do_the_silent_slow_stuff_Now();

// <--- presumably the php execution ends here.
?>

Я не могу понять, почему FirePHP пытается что-то сделать после завершения страницы после того, как я распечатал буфер и очистил его? Или что пытается? Как я могу справиться с этой проблемой? :(


person PatlaDJ    schedule 05.07.2011    source источник
comment
что ты делаешь в do_the_silent_slow_stuff_Now()? Если есть какой-либо вызов для запуска php, он попытается отправить заголовки, что не сработает, поскольку вы уже отправили вывод с помощью flush().   -  person Sascha Galley    schedule 05.07.2011
comment
хехе :) Да. У меня был один вызов fb() в do_the_silent_slow_stuff_Now(). Как мне не пришло в голову, что проблема была там. Так просто! Я ожидал, что проблема будет где-то перед операторами эха, но так нелогично смотреть туда. В любом случае, напишите это как ответ на мой вопрос, я отмечу это как ответ. Это может быть полезно для некоторых сбитых с толку гуглеров вроде меня :)   -  person PatlaDJ    schedule 05.07.2011


Ответы (1)


Вот ваша проблема:

Заголовки уже отправлены в строке #...

Это именно то, что происходит, когда вы используете FirePHP и заранее что-то повторяете. Это может быть даже пробел перед тегом <?php. FirePHP отправляет все свое содержимое в виде заголовка, а заголовки не могут быть отправлены после любого вывода.

Поскольку я уверен, что вы вызываете FirePHP в своем методе do_the_silent_slow_stuff_Now();, я рекомендую не использовать буферизацию, очистку и FirePHP одновременно.

Либо вы уходите в отставку на ob_start() и ob_flush() на этапе разработки, либо вызываете метод ob_flush() после того, как все сделано.

Третьей возможностью было бы разделить вашу фазу разработки и живую, выполнив что-то вроде $development = true; и создав свою собственную функцию FirePHP:

function my_fb($text) {
    if(!$development)
        fb($text);
}

и:

if($development) {
    do_the_silent_slow_stuff_Now();
    ob_flush(); flush();
}
else {
    ob_flush(); flush();
    do_the_silent_slow_stuff_Now();
}

Надеюсь это поможет!

person Sascha Galley    schedule 05.07.2011
comment
Теперь, когда я полностью понимаю это поведение, в дополнение к вашей рекомендации я также добавлю еще одну рекомендацию: добавление второго уровня буферизации вывода. - person PatlaDJ; 05.07.2011
comment
@PatlaDJ рад, что смог помочь ... Я также добавил некоторые детали в свой ответ. - person Sascha Galley; 05.07.2011