什么是在PHP中使用没有任何参数的ob_start

时间:2010-06-18 19:20:08

标签: php caching buffering ob-start

我可以看到ob_startoutput_callback参数集的使用,但在调用它时,我看不到使用ob_start而没有设置任何参数。

什么时候禁止输出以便稍后抛出所有输出?这是否会使用更多内存(服务器端)和慢速下载(客户端),因为下载仅在页面完全呈现后(或调用ob_end_flush时)开始?

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

任何人都可以在不设置任何参数的情况下向我提供使用ob_start()的使用/优势(如上面的代码段所示)。

4 个答案:

答案 0 :(得分: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()预计返回一个字符串而不是回显它,我使用输出缓冲来捕获模板并返回它...

答案 1 :(得分:2)

如果你有一个PHP脚本使用echo来输出很多小块,那么如果用ob_start()缓冲,那么PHP脚本运行得更快,然后在你完成后将它们全部刷新。

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

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

是的,它会延迟输出,直到完成所有操作,但由于PHP运行速度更快,因此总耗用时间会更短。您的Apache线程越早转移到另一个请求,您的站点的可伸缩性就越好。

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

答案 2 :(得分:1)

一种用法是阻止php发送标题,直到脚本准备发送其内容为止,因为这样可以在构建输出时更改标题。

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

答案 3 :(得分:0)

  1. 确保您没有收到“标头已发送”错误
  2. 捕获所有html数据以创建缓存文件
  3. 我只会用它2,因为我认为1永远不会发生