2011-07-05 5 views
2

Я получаю необъяснимую ошибку «Заголовки, уже отправленные по строке # ...» на те две строки, которые выполняют «эхо ...» в приведенном ниже коде.Ошибка с буферизацией вывода и FirePHP

Упрощенная версия корпуса:

<?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 пытается сделать что-то после завершения страницы после того как я напечатать буфер и промыть его? Или что он пытается? Как я могу справиться с этой проблемой? :(

+1

Что вы делаете в 'do_the_silent_slow_stuff_Now()'? Если есть какой-либо вызов fire fire, он попытается отправить заголовки, которые не будут работать, поскольку вы уже отправили вывод с помощью 'flush()'. –

+0

hehe :) Да. У меня был один вызов fb() в do_the_silent_slow_stuff_Now(). Как мне не приходило в голову, что проблема была там. Так просто! Я ожидал, что проблема будет где-то до эхо-заявлений, но так нелогично смотреть туда. В любом случае, напишите это как ответ на мой вопрос, я буду отмечать его как ответ. Может быть полезно, чтобы какой-то googler был сбит с толку, как я :) – PatlaDJ

ответ

3

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

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

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

Поскольку я уверен, что вы называете огнь PHP в вашем методе 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(); 
} 

Надеется, что это помогает!

+0

Теперь, когда я полностью понимаю это поведение, в дополнение к вашей рекомендации я также добавлю еще одну рекомендацию: добавление второго уровня буферизации вывода. – PatlaDJ

+0

@PatlaDJ рад, что я мог бы помочь ... Я также добавил некоторые детали к моему ответу. –

Смежные вопросы