PHP中的输出缓冲?

时间:2009-03-18 12:23:06

标签: php output-buffering

我似乎对PHP输出缓冲感到困惑。我有这样的代码:

function return_json($obj) {
  ob_get_clean();
  ob_start();
  header("Content-Type: application/json");
  echo json_encode($obj);
  exit;
}

但它似乎不喜欢ob_get_clean()。我之所以这样做,是因为某些HTML可能会在达到这一点之前意外生成,但我认为这就是你的意图。

我错过了什么?

6 个答案:

答案 0 :(得分:9)

要使用ob_get_clean(),你必须确定,在某些时候你先前有ob_start()'ed。否则,没有要清理的缓冲区,所有内容都已刷新到用户代理。

答案 1 :(得分:7)

使用ob_get_level() function查看输出缓冲区是否处于活动状态并退出:

while (ob_get_level()) {
    ob_end_clean();
}

答案 2 :(得分:3)

你需要在所有代码之前执行ob_start以在调用该函数之前捕获任何输出

答案 3 :(得分:1)

如果您只想在使用

开始输出缓冲后清理缓冲区
ob_start() 

使用

ob_clean()

另外请注意,没有任何内容已经被echo,print_r等函数刷新。所以脚本中的第一件事应该是ob_start()。确保您的包含内容尚未向浏览器发送内容。

答案 4 :(得分:0)

需要在生成任何内容之前调用ob_start。正常使用类似于:

ob_start();
# generated content here

$content = ob_get_contents(); # $content now contains anything that has been output already
ob_end_clean();

# generate any headers you need
echo $content;

答案 5 :(得分:0)

如果您遇到的问题是没有输出,您似乎错过了flush方法?此外,ob_end_clean()只能在输出缓冲启动后调用,否则返回'false'。您无法使用ob_方法清除已发布的任何现有标头,您需要自己确认。

function return_json($obj) {
  ob_start();
  header("Content-Type: application/json");
  echo json_encode($obj);
  ob_end_flush();
  exit;
}