2

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

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

但它似乎不喜欢 ob_get_clean()。我这样做是因为一些 HTML 可能会在它到达那个点之前意外生成,但我认为这就是你应该这样做的方式。

我错过了什么?

4

6 回答 6

9

要使用 ob_get_clean (),您必须确定,在某个时间点您早前已经使用了 ob_start ()。否则,没有要清理的缓冲区,所有内容都已刷新到用户代理。

于 2009-03-18T12:25:29.960 回答
7

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

while (ob_get_level()) {
    ob_end_clean();
}
于 2009-03-18T12:34:38.987 回答
3

在调用该函数之前,您必须在所有代码之前执行 ob_start 以捕获任何输出

于 2009-03-18T12:25:18.400 回答
1

如果您只想在开始输出缓冲后清理缓冲区

ob_start() 

采用

ob_clean()

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

于 2009-03-18T12:27:11.313 回答
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;
于 2009-03-18T12:29:20.153 回答
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;
}
于 2009-03-18T13:13:32.263 回答