ob_start()是否用于输出缓冲,以便头被缓冲而不发送到浏览器?我说的有道理吗?如果不是,那么为什么我们要使用ob_start()?


当前回答

这个函数不仅仅用于头文件。你可以用它做很多有趣的事情。例子:你可以把你的页面分成几个部分,像这样使用:

$someTemplate->selectSection('header');
echo 'This is the header.';

$someTemplate->selectSection('content');
echo 'This is some content.';

您可以捕获此处生成的输出,并将其添加到布局中的两个完全不同的位置。

其他回答

不,你错了,但方向是合适的;)

output - buffering缓冲脚本的输出。这就是(简而言之)回声或打印后的一切。头部的事情是,他们只能被发送,如果他们还没有被发送。但是HTTP表示,头信息是传输的第一步。因此,如果你第一次(在请求中)输出某些内容,则发送头信息,并且不能设置其他头信息。

你搞反了。Ob_start不缓冲头文件,它缓冲内容。使用ob_start允许您将内容保存在服务器端缓冲区中,直到准备好显示它为止。

这是常用的,这样页面就可以在他们已经“发送”了一些内容之后发送标题(例如,在渲染页面的中途决定重定向)。

这个函数不仅仅用于头文件。你可以用它做很多有趣的事情。例子:你可以把你的页面分成几个部分,像这样使用:

$someTemplate->selectSection('header');
echo 'This is the header.';

$someTemplate->selectSection('content');
echo 'This is some content.';

您可以捕获此处生成的输出,并将其添加到布局中的两个完全不同的位置。

以下内容在现有的答案中没有提及: 缓冲区大小配置 HTTP报头 和嵌套。

ob_start的缓冲区大小配置:

ob_start(null, 4096); // Once the buffer size exceeds 4096 bytes, PHP automatically executes flush, ie. the buffer is emptied and sent out.

上面的代码提高了服务器性能,因为PHP将发送更大的数据块,例如,4KB(如果没有ob_start调用,PHP将向浏览器发送每个echo)。

如果你开始缓冲没有块大小(即。一个简单的ob_start()),那么页面将在脚本的末尾发送一次。

输出缓冲不会影响HTTP报头,它们以不同的方式处理。然而,由于缓冲,你可以在输出发送后发送头,因为它仍然在缓冲区中。

ob_start();  // turns on output buffering
$foo->bar();  // all output goes only to buffer
ob_clean();  // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents();  // buffer content is now an empty string
ob_end_clean();  // turn off output buffering

这里有很好的解释:https://phpfashion.com/everything-about-output-buffering-in-php

我使用这个,所以我可以用很多HTML跳出PHP,但不渲染它。它使我不必将它存储为禁用IDE颜色编码的字符串。

<?php
ob_start();
?>
<div>
    <span>text</span>
    <a href="#">link</a>
</div>
<?php
$content = ob_get_clean();
?>

而不是:

<?php
$content = '<div>
    <span>text</span>
    <a href="#">link</a>
</div>';
?>