1

我可以看到带有参数集的ob_start的使用,但是在没有设置任何参数output_callback的情况下调用它时我看不到使用。ob_start

禁用输出以稍后立即抛出所有输出有什么意义?由于仅在页面完全呈现后(或调用ob_end_flush时)才开始下载,这不会使用更多内存(服务器端)和缓慢的下载(客户端)吗?

ob_start();
for ($i = 1; $i <= 15; $i++)
{
    echo $i, ' ';
    sleep(1);
}
ob_end_flush();

ob_start()任何人都可以给我在不设置任何参数的情况下使用的用法/优点(如上面的代码片段)。

4

4 回答 4

4

一个原因是为了“抓取”一小段代码的输出。

因此,假设您有一段要执行的独立代码,但您不想直接输出它。你能做的是

ob_start();
include 'file.php';
$output = ob_get_clean();

我会给你一个现实世界的例子。假设您正在为应用程序构建安装程序。作为该安装程序的一部分,您希望显示当前的 PHP 信息(来自 的数据phpinfo())。但是,您希望将该信息与页面的其余部分集成(而不是使用框架)。因此,您可以做的是phpinfo()使用输出缓冲区获取输出,对其进行修改,然后将其显示在模板文件中您想要的位置。

ob_start();
phpinfo();
$info = ob_get_clean();
//Massage the output, remove the doctype, html, head, and body tags
echo $info;

我也将它与视图文件一起使用。在 View 类中,该__toString()方法实际呈现视图。但由于__toString()预计会返回一个字符串而不是回显它,我使用输出缓冲来捕获模板并返回它......

于 2010-06-18T19:39:23.200 回答
2

如果您有一个 PHP 脚本,它使用 echo 以许多小块输出,那么如果您缓冲ob_start()并在完成后将其全部刷新,那么 PHP 脚本会运行得更快。

(注意:这只是来自 PHP 核心开发人员的博客的报告;我自己没有测试过,所以我没有具体的数字来说明它的速度有多快。)

是的,它将缓冲区保存在内存中,但是您的 HTML 输出有多大?与 PHP 环境的内存限制相比,可能非常小。

是的,它会延迟输出直到全部完成,但由于 PHP 运行得更快,总运行时间会更少。您的 Apache 线程越早转移到另一个请求,您的站点的可扩展性就越好。

这并不是说每个页面都受益于使用输出缓冲。在典型的 PHP 脚本中,这种好处可能是微不足道的,该脚本主要是带有一些可变元素的静态 HTML。

于 2010-06-18T19:26:27.840 回答
1

一种用法是在脚本准备好发送其内容之前阻止 php 发送标头,因为这将允许您在构建输出时更改标头。

阅读这是一篇关于输出缓冲的文章,以获得更多关于如何使用它的想法。 http://www.devshed.com/c/a/PHP/Output-Buffering-With-PHP/

于 2010-06-18T19:38:08.780 回答
0
  1. 确保您没有收到“标头已发送”错误
  2. 捕获所有 html 数据以创建缓存文件

我只会将它用于 2,因为我认为 1 无论如何都不应该发生

于 2010-06-18T19:30:04.873 回答