【问题标题】:Output buffering in PHP?PHP中的输出缓冲?
【发布时间】:2009-03-18 12:23:06
【问题描述】:

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

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

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

我错过了什么?

【问题讨论】:

  • 那么到底出了什么问题? “它似乎不喜欢 ob_get_clean()”是什么意思?它是否说标头已经发送?如果没有得到 JSON 输出,则应删除函数中的 ob_start()。
  • 我的 JSON 调用出错。好像没有返回载荷。
  • 如果我没看错,你不知道脚本的输出是什么?你使用 FireBug 吗?仅用于测试:将 Content-Type 替换为一些 HTMLish 内容并直接调用脚本。

标签: php output-buffering


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我在脚本开始时执行 ob_start()
      • 你需要在ob_get_clean()之前拥有它
      【解决方案4】:

      如果您只想在使用

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

      使用

      ob_clean()
      

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

      【讨论】:

        【解决方案5】:

        需要在生成任何内容之前调用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;
        

        【讨论】:

          【解决方案6】:

          如果您遇到的问题是什么都不会输出,那么您似乎缺少 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;
          }
          

          【讨论】:

          • 这似乎不是问题,我测试了未知(雅虎)的代码,退出时 PHP 刷新就好了。不幸的是,他没有告诉我们他的输出是什么。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多