在PHP中使用ob_start()有什么用?

ob_start()用于output buffering ,使标题被缓冲,而不是发送到浏览器? 我在这里有意义吗? 如果不是那么为什么我们应该使用ob_start()

ob_start()想成是“开始记住通常会输出的所有东西,但是还没有做任何事情”。

例如:

 ob_start(); echo("Hello there!"); //would normally get printed to the screen/output to browser $output = ob_get_contents(); ob_end_clean(); 

还有两个其他的函数,它们通常与ob_get_contents()配对: ob_get_contents() ,它基本上给你任何已经被保存到缓冲区的内容,因为它是用ob_start() ,然后是ob_end_clean()ob_flush()停止保存东西,丢弃任何保存的东西,或者分别停止保存并一次输出。

我使用这个,所以我可以打破了很多HTML的PHP​​,但没有呈现。 它可以避免我将它存储为禁用颜色编码的string。

 <?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>'; ?> 

这里接受的答案描述了什么ob_start()所做的 – 不是为什么它被使用(这是问的问题)。

如别处所述ob_start()创build一个输出写入的缓冲区。

但是没有人提到可以在PHP中堆叠多个缓冲区。 请参阅ob_get_level ()。

至于为什么….

  1. 以较大的块向浏览器发送HTML会降低networking开销,从而提高性能。

  2. 将数据以较大的块传递出PHP,通过减less所需的上下文切换次数来提高性能和容量

  3. 将更大的数据块传递给mod_gzip / mod_deflate会带来性能上的好处,因为压缩效率更高。

  4. 缓冲输出意味着您仍然可以在代码中稍后处理HTTP头文件

  5. 在输出[head] ….之后明确清空缓冲区。[/ head]可以允许浏览器在HTMLstream完成之前开始封送页面的其他资源。

  6. 在缓冲区捕获输出意味着它可以redirect到其他function,如电子邮件,或作为内容的caching表示复制到文件

你有它倒退。 ob_start不缓冲标题,它缓冲内容。 通过使用ob_start ,您可以将内容保留在服务器端缓冲区中,直到您准备好显示它为止。

这是常用的,以便页面可以在'已经'发送'一些内容之后发送标题'(即,决定通过呈现页面的一半来redirect)。

这是为了进一步澄清JD Isaaks的答案…

你遇到的问题经常是你使用php从许多不同的php源输出html,而且这些源经常以不同的方式输出。

有时你有直接输出到浏览器的文字html内容; 其他时候输出是dynamic创build的(服务器端)。

dynamic内容总是(?)成为一个string。 现在,您必须将这个string化的dynamichtml与任何直接显示html的文字结合成一个有意义的html节点结构。

这通常会迫使开发人员将所有直接显示的内容封装到一个string中(如JD Isaak所讨论的),以便它可以与dynamichtml一起正确地传递/插入…即使您并不真正想要它包裹。

但是通过使用ob _ ##方法,您可以避免那个string包装混乱。 文字内容被输出到缓冲区。 然后在一个简单的步骤中缓冲区的全部内容(所有你的文字html)被连接到你的dynamic-htmlstring中。

(我的例子显示了正在输出到缓冲区的文字html,然后将其添加到一个htmlstring中…请参阅JD Isaaks示例以查看string包装的html)。

 <?php // parent.php //--------------------------------- $lvs_html = "" ; $lvs_html .= "<div>html</div>" ; $lvs_html .= gf_component_assembler__without_ob( ) ; $lvs_html .= "<div>more html</div>" ; $lvs_html .= "----<br/>" ; $lvs_html .= "<div>html</div>" ; $lvs_html .= gf_component_assembler__with_ob( ) ; $lvs_html .= "<div>more html</div>" ; echo $lvs_html ; // 02 - component contents // html // 01 - component header // 03 - component footer // more html // ---- // html // 01 - component header // 02 - component contents // 03 - component footer // more html //--------------------------------- function gf_component_assembler__without_ob( ) { $lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ; include( "component_contents.php" ) ; $lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ; return $lvs_html ; } ; //--------------------------------- function gf_component_assembler__with_ob( ) { $lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ; ob_start(); include( "component_contents.php" ) ; $lvs_html .= ob_get_clean(); $lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ; return $lvs_html ; } ; //--------------------------------- ?> 

 <!-- component_contents.php --> <div> 02 - component contents </div> 

我更喜欢:

 ob_start(); echo("Hello there!"); $output = ob_get_clean(); //Get current buffer contents and delete current output buffer 

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

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

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

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

输出缓冲缓冲脚本的输出。 多数民众赞成(简而言之)在echoprint 。 标题是,他们只能发送,如果他们还没有发送。 但HTTP表示,标题是传输的第一个。 所以如果你第一次输出的东西(在请求中)标题被发送,你不能设置任何其他标题。