我对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}}未显示
答案 0 :(得分:1)
<p> showing stundent by id </p>
<?php
showContent()
{
if(!$students){
header('Location: /404');
}else{
//show students
}
}
}
这是一种可怕的编码方式。您已经完成了输出,正如您所指出的那样,这会阻止您更改header()
。这是MVC背后的主要驱动因素,它认为您需要细分代码并将视图(HTML)与控制器(PHP)分开。在这种情况下,您已将函数与HTML内联。
有几种方法可以解决这个问题,而无需求助于输出缓冲
$students
(比如获取/构建数据集)并在那里发布404。答案 1 :(得分:0)
我有同样的问题并通过添加:
解决了这个问题ob_implicit_flush(true);
到php文件的开头。这会立即输出所有内容,您可以将其他刷新命令输出。
http://php.net/manual/en/function.ob-implicit-flush.php
ob_implicit_flush()将打开或关闭隐式刷新。含蓄 每次输出调用后刷新都会导致刷新操作,所以
将不再需要显式调用flush()