输出缓冲和FirePHP出错

时间:2011-07-05 14:38:56

标签: php debugging firebug output-buffering 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在打印缓冲区并刷新后会在页面完成时尝试执行某些操作?或者它在尝试什么?我该如何应对这个问题? :(

1 个答案:

答案 0 :(得分:3)

这是你的问题:

  

标题已在线上发送#...

很明显当你使用FirePHP并事先回应一些东西时会发生什么。这甚至可能是<?php标记之前的空格。 FirePHP将其所有内容作为标题发送,并且在进行任何输出后都无法发送标题。

由于我确信您使用do_the_silent_slow_stuff_Now();方法调用FirePHP,我建议不要立即使用缓冲,刷新和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();
}

希望这有帮助!