什么是输出缓冲?为什么在PHP中使用它?
答案 0 :(得分:254)
Output Buffering for Web Developers, a Beginner’s Guide:
如果没有输出缓冲(默认值),您的HTML会随着PHP处理脚本一起发送到浏览器。使用输出缓冲,您的HTML存储在变量中,并在脚本末尾作为一个整体发送到浏览器。
Web开发人员的输出缓冲优势
- 单独启用输出缓冲会减少下载和呈现HTML所需的时间,因为当PHP处理HTML时,它不会被分批发送到浏览器。
- 我们可以用PHP字符串做的所有花哨的东西,我们现在可以将整个HTML页面作为一个变量。
- 如果您在设置Cookie时遇到过“警告:无法修改标题信息 - 已经由(输出)发送的标题”,您会很高兴知道输出缓冲是您的答案。
答案 1 :(得分:62)
Output buffering来提高性能并执行一些技巧。
您可以让PHP将所有输出存储到缓冲区中,并立即输出所有输出,从而提高网络性能。
在某些情况下,您可以访问缓冲区内容而不将其发送回浏览器。
考虑这个例子:
<?php
ob_start( );
phpinfo( );
$output = ob_get_clean( );
?>
上面的示例将输出捕获到变量中,而不是将其发送到浏览器。默认情况下,output_buffering处于关闭状态。
考虑这个例子:
<?php
ob_start( );
echo "Hello World";
if ( $some_error )
{
header( "Location: error.php" );
exit( 0 );
}
?>
答案 2 :(得分:9)
输出控制功能允许您 控制何时发送输出 剧本。这可能很有用 几种不同的情况, 特别是如果你需要发送标题 你的脚本之后到浏览器 开始输出数据。输出 控制功能不受影响 使用header()或发送的标头 setcookie(),只有像 echo()和PHP块之间的数据 代码。
http://php.net/manual/en/book.outcontrol.php
更多资源:
答案 3 :(得分:5)
我知道这是一个老问题,但是我想为视觉学习者写答案。我找不到任何图表来解释万维网上的输出缓冲,因此我自己在mspaint中做了一些事情。
如果关闭了输出缓冲,那么echo
将立即向浏览器发送数据。
如果打开了输出缓冲,那么echo
会将数据发送到输出缓冲区,然后再将其发送到浏览器。
phpinfo
要查看是否打开/关闭输出缓冲,请参阅核心部分的phpinfo。 output_buffering
指令将告诉您是否打开/关闭输出缓冲。
在这种情况下,output_buffering
的值为4096,这意味着缓冲区大小为4 KB。这也意味着在Web服务器上打开了输出缓冲。
php.ini
可以通过更改output_buffering
伪指令的值来打开/关闭和更改缓冲区大小。只需在php.ini
中找到它,将其更改为您选择的设置,然后重新启动Web服务器。您可以在下面找到我的php.ini
的示例。
; Output buffering is a mechanism for controlling how much output data
; (excluding headers and cookies) PHP should keep internally before pushing that
; data to the client. If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
; functions.
; Possible Values:
; On = Enabled and buffer is unlimited. (Use with caution)
; Off = Disabled
; Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096
指令output_buffering
并不是关于输出缓冲的唯一可配置指令。您可以在这里找到其他可配置的输出缓冲指令:http://php.net/manual/en/outcontrol.configuration.php
示例:ob_get_clean()
下面您将看到如何捕获echo
并将其发送给浏览器之前对其进行操作。
// Turn on output buffering
ob_start();
echo 'Hello World'; // save to output buffer
// Get content which is in the output buffer ...
// ... and delete output buffer
$output = ob_get_clean();
$output = strtoupper($output); // manipulate the output
echo $output; // send to output stream / Browser
// OUTPUT:
HELLO WORLD
示例:Hackingwithphp.com
有关输出缓冲区的更多信息和示例,可以在这里找到:
答案 4 :(得分:4)
答案 5 :(得分:1)
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
缓冲区可以嵌套,因此当一个缓冲区处于活动状态时,另一个ob_start()会激活一个新的缓冲区。因此,ob_end_flush()和ob_flush()并不是真正将缓冲区发送到输出,而是发送到父缓冲区。而且只有当没有父缓冲区时,内容才会发送到浏览器或终端。
在这里做得很好:https://phpfashion.com/everything-about-output-buffering-in-php
答案 6 :(得分:0)
UPDATE2019。如果您具有专用服务器和SSD或更好的NVM,请使用3.5GHZ。您不应该使用缓冲在100ms-150ms内使网站加载速度更快。
因为与使用性能服务器(服务器,服务器,内存,磁盘)并打开APC PHP的2019年处理脚本相比,网络运行速度慢:)生成脚本有时仅需要70毫秒,而另一个时间只是网络需要时间,从10毫秒到距离用户服务器150ms。
因此,如果您想要快150ms,则缓冲会变慢,因为需要额外的收集缓冲区数据,因此会产生额外的开销。 10年前,服务器制作1s脚本非常有用。
请注意,如果您希望使用jpg来加载jpg,则output_buffering会有限制,可以刷新自动化并崩溃发送。
干杯。
您可以快速造河 要么 您可以安全地制作多摩:)
答案 7 :(得分:0)
这是php中输出缓冲的总结。 (XAMPP php.ini )
输出缓冲是一种控制输出数据量的机制 (不包括标头和 cookie)PHP 应该在推送之前保留在内部 数据给客户端。如果您的应用程序的输出超过此设置,PHP 将以您指定大小的块发送该数据。打开此设置并管理其最大缓冲区大小可能会产生一些有趣的副作用,具体取决于您的应用程序和 Web 服务器。在您已经通过打印或回显发送输出后,您可以发送标头和 cookie。如果您的服务器由于缓冲输出而不是 PHP 流式传输输出而发出的数据包较少,您也可能会看到性能优势 当它得到它时。在生产服务器上,4096 字节是一个很好的性能设置 原因。
注意:输出缓冲也可以通过输出缓冲控制来控制 功能。
可能的值:
On = 启用并且缓冲区是无限的。 (谨慎使用)
关闭 = 已禁用
Integer = 启用缓冲区并设置其最大大小(以字节为单位)。
注意:对于 CLI SAPI,此指令被硬编码为 Off
默认值:关闭
开发价值:4096
产值:4096
http://php.net/output-buffering 输出缓冲=4096