ob_start()是否用于输出缓冲,以便头被缓冲而不发送到浏览器?我说的有道理吗?如果不是,那么为什么我们要使用ob_start()?
当前回答
以下内容在现有的答案中没有提及: 缓冲区大小配置 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
其他回答
我喜欢:
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.';
您可以捕获此处生成的输出,并将其添加到布局中的两个完全不同的位置。
我使用这个,所以我可以用很多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>';
?>
以下内容在现有的答案中没有提及: 缓冲区大小配置 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
这是为了进一步澄清JD Isaaks的答案…
您经常遇到的问题是,您使用php从许多不同的php源输出html,而出于某种原因,这些源通常通过不同的方式输出。
有时你有文字html内容,你想直接输出到浏览器;其他时候输出是动态创建的(服务器端)。
动态内容总是一个字符串。现在你必须结合这个字符串化的动态html与任何文字,直接显示html…转换成一个有意义的HTML节点结构。
这通常迫使开发人员将所有直接显示的内容包装成一个字符串(就像JD Isaak讨论的那样),这样它就可以与动态html一起正确地交付/插入……即使你不想把它包起来。
但是通过使用ob_##方法,可以避免字符串换行的混乱。相反,文字内容输出到缓冲区。然后在一个简单的步骤,整个内容的缓冲区(所有文字html),连接到您的动态html字符串。
(我的例子显示文字html输出到缓冲区,然后添加到一个html-string…也可以看看JD Isaaks的例子,看看字符串- wrapped -of-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>
推荐文章
- 在取消设置元素后重新设置数组键
- 如何修剪空白的数组值在php
- PHP中的双not(!!)操作符
- 在PHP5中创建单例设计模式
- 阻止人们入侵基于php的Flash游戏高分表的最佳方法是什么
- PHP子字符串提取。获取第一个'/'之前的字符串或整个字符串
- __construct函数的作用是什么?
- PHP中的异步shell执行器
- Laravel 5 -如何访问在视图存储上传的图像?
- 为什么在PHP中使用sprintf函数?
- “质量分配”在Laravel中是什么意思?
- 在逗号上爆炸字符串,并修剪每个值的潜在空格
- PHP与MySQL 8.0+错误:服务器请求身份验证方法未知的客户端
- laravel5“LIKE”对等物(雄辩的)
- 在函数中使用默认实参