我可以看到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()
的使用/优势(如上面的代码段所示)。
答案 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)
我只会用它2,因为我认为1永远不会发生