输出缓冲不显示内容

时间:2014-07-22 13:32:01

标签: php header output-buffering

我对PHP很新,对ob_函数更是如此,所以请帮助我理解这一点,因为手册在某种程度上并没有提供一个非常简单的示例或参考。

我假设“输出缓冲”是延迟并保持php发送标头直到发送完整内容的原因,这可能是header()函数在ob_start()ob_start()时不会发出错误的原因如上所述。如果是这样,我的问题是如何“缓冲”只有一些内容,而不是仅仅在我的脚本顶部提到<?php namespace App\Controller; class Home extends Controller{ public function showHomePage() { $students = $pdo->query('SELECT id FROM students'); $view->showContent($students); // includes content.php } } ,这大大减慢了我的应用程序?

实施例。

<p> showing stundent by id </p>
<?php 
showContent()
{
    if(!$students){
        header('Location: /404'); 
    }else{
         //show students
        }
    }

}

// content.php

content.php

现在您可以在上面的示例中看到,只要加载header already sent,它就会发出$students发送错误(如果ob_start()计算结果为false / null),那么,到隐藏此错误,我将howHomePage置于public function showHomePage() { $students = $pdo->query('SELECT id FROM students'); ob_start(); $view->showContent($students); // includes content.php } 方法中,如此处所示

showContent()

现在,通过上面的方法,我没有得到头错误,但是我想在执行ob_start()方法后立即关闭该缓冲区。在其他方面,我不希望 public function showHomePage() { $students = $pdo->query('SELECT id FROM students'); ob_start(); $view->showContent($students); // includes content.php on_end_flush(); } 仅适用于以下函数。我试着做这样的事情

showContent()

但现在,内容{{1}}未显示

2 个答案:

答案 0 :(得分:1)

<p> showing stundent by id </p>
<?php 
showContent()
{
    if(!$students){
        header('Location: /404'); 
    }else{
         //show students
        }
    }

}

这是一种可怕的编码方式。您已经完成了输出,正如您所指出的那样,这会阻止您更改header()。这是MVC背后的主要驱动因素,它认为您需要细分代码并将视图(HTML)与控制器(PHP)分开。在这种情况下,您已将函数与HTML内联。

有几种方法可以解决这个问题,而无需求助于输出缓冲

  1. 检查页面前面的$students(比如获取/构建数据集)并在那里发布404。
  2. 将您的HTML移动到单独的模板文件中(可以查看Smarty以获取帮助),然后在那里进行绘图。

答案 1 :(得分:0)

我有同样的问题并通过添加:

解决了这个问题
ob_implicit_flush(true);

到php文件的开头。这会立即输出所有内容,您可以将其他刷新命令输出。

http://php.net/manual/en/function.ob-implicit-flush.php

  

ob_implicit_flush()将打开或关闭隐式刷新。含蓄   每次输出调用后刷新都会导致刷新操作,所以   

将不再需要显式调用flush()