什么是输出缓冲?

时间:2010-05-14 05:29:06

标签: php output-buffering

什么是输出缓冲?为什么在PHP中使用它?

8 个答案:

答案 0 :(得分:254)

Output Buffering for Web Developers, a Beginner’s Guide

  

如果没有输出缓冲(默认值),您的HTML会随着PHP处理脚本一起发送到浏览器。使用输出缓冲,您的HTML存储在变量中,并在脚本末尾作为一个整体发送到浏览器。

     

Web开发人员的输出缓冲优势

     
      
  • 单独启用输出缓冲会减少下载和呈现HTML所需的时间,因为当PHP处理HTML时,它不会被分批发送到浏览器。
  •   
  • 我们可以用PHP字符串做的所有花哨的东西,我们现在可以将整个HTML页面作为一个变量。
  •   
  • 如果您在设置Cookie时遇到过“警告:无法修改标题信息 - 已经由(输出)发送的标题”,您会很高兴知道输出缓冲是您的答案。
  •   

答案 1 :(得分:62)

PHP使用

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

更多资源:

Output Buffering With PHP

答案 3 :(得分:5)

我知道这是一个老问题,但是我想为视觉学习者写答案。我找不到任何图表来解释万维网上的输出缓冲,因此我自己在mspaint中做了一些事情。

如果关闭了输出缓冲,那么echo将立即向浏览器发送数据。

enter image description here

如果打开了输出缓冲,那么echo会将数据发送到输出缓冲区,然后再将其发送到浏览器。

enter image description here

phpinfo

要查看是否打开/关闭输出缓冲,请参阅核心部分的phpinfo。 output_buffering指令将告诉您是否打开/关闭输出缓冲。

enter image description here 在这种情况下,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

有关输出缓冲区的更多信息和示例,可以在这里找到:

http://www.hackingwithphp.com/13/0/0/output-buffering

答案 4 :(得分:4)

正如名称所示,内存缓冲区用于管理脚本输出的显示方式。

这是主题

的一个very good tutorial

答案 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