Php 什么是输出缓冲?

Php 什么是输出缓冲?,php,output-buffering,Php,Output Buffering,什么是输出缓冲?为什么在PHP中使用它 如果没有输出缓冲(默认设置),HTML将在PHP通过脚本处理时以片段的形式发送到浏览器。通过输出缓冲,HTML存储在一个变量中,并作为脚本末尾的一部分发送到浏览器 Web开发人员使用输出缓冲的优势 单独打开输出缓冲可以减少下载和呈现HTML所需的时间,因为在PHP处理HTML时,HTML不会被分块发送到浏览器 我们可以用PHP字符串做的所有有趣的事情,现在我们可以把整个HTML页面作为一个变量来做 如果您在设置cookie时遇到消息“警告:无法修改标题信

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

如果没有输出缓冲(默认设置),HTML将在PHP通过脚本处理时以片段的形式发送到浏览器。通过输出缓冲,HTML存储在一个变量中,并作为脚本末尾的一部分发送到浏览器

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

  • 单独打开输出缓冲可以减少下载和呈现HTML所需的时间,因为在PHP处理HTML时,HTML不会被分块发送到浏览器
  • 我们可以用PHP字符串做的所有有趣的事情,现在我们可以把整个HTML页面作为一个变量来做
  • 如果您在设置cookie时遇到消息“警告:无法修改标题信息-标题已由(输出)发送”,您会很高兴知道输出缓冲是您的答案
输出控制功能允许您 控制何时从发送输出的步骤 剧本。这在某些情况下很有用 几种不同的情况,, 尤其是当你需要发送标题的时候 在脚本完成后,将其添加到浏览器 开始输出数据。输出 控制功能不影响 使用header()或 setcookie(),仅函数,如 echo()和PHP块之间的数据 代码

更多资源:

被PHP用来提高性能和执行一些技巧

  • 您可以让PHP将所有输出存储到缓冲区中,然后一次输出所有输出,从而提高网络性能

  • 在某些情况下,您可以访问缓冲区内容,而无需将其发送回浏览器

考虑这个例子:

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>
<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>

上面的示例将输出捕获到变量中,而不是将其发送到浏览器。默认情况下关闭输出缓冲

  • 在发送内容后要修改标题的情况下,可以使用输出缓冲
考虑这个例子:

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>
<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>

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

这里有一个主题

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\u start()
会激活一个新的缓冲区。因此
ob\u end\u flush()
ob\u flush()
实际上并没有将缓冲区发送到输出,而是发送到父缓冲区。只有在并没有父缓冲区时,内容才会发送到浏览器或终端


这里解释得很好:

我知道这是一个老问题,但我想为视觉学习者写我的答案。我在万维网上找不到任何解释输出缓冲的图表,所以我自己在Windows
mspaint.exe
中制作了一个图表

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

如果打开了输出缓冲,则在将数据发送到浏览器之前,
echo
会将数据发送到输出缓冲区

phpinfo

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

在这种情况下,
output\u buffering
值为4096,这意味着缓冲区大小为4KB。这还意味着在Web服务器上打开了输出缓冲

php.ini

通过更改
output\u 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\u buffering
不是关于输出缓冲的唯一可配置指令。您可以在此处找到其他可配置的输出缓冲指令:

示例:ob\u get\u clean()

在下面,您可以看到如何捕获
回音
,并在将其发送到浏览器之前对其进行操作

// Turn on output buffering  
ob_start();  

echo 'Hello World';  // save to output buffer

$output = ob_get_clean();  // Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output); // manipulate the output  

echo $output;  // send to output stream / Browser

// OUTPUT:  
HELLO WORLD
示例:Hackingwithphp.com

有关输出缓冲区和示例的更多信息,请参见:


2019年更新。如果您有专用服务器和SSD或更好的NVM,3.5GHZ。您不应该使用缓冲来在100ms-150ms内创建加载速度更快的网站

因为在2019年,使用高性能服务器(服务器、内存、磁盘)并启用APC PHP:)生成脚本时,网络的速度比处理脚本慢,有时只需要70毫秒。另一个时间是,仅网络需要时间,从距离定位用户服务器10毫秒到150毫秒不等

所以,如果你想快150毫秒,缓冲使慢,因为需要额外的收集缓冲区数据,它使额外的成本。10年前,当服务器制作1s脚本时,它是有用的

请注意输出缓冲有限制,如果你想使用jpg加载它可以自动刷新和崩溃发送

干杯

你可以在河上走得很快 或
您可以安全地使用tama:)

这是php中输出缓冲的总结。(XAMPP php.ini)

输出缓冲是一种控制输出数据量的机制 (不包括标题和cookie)在推送之前,PHP应该在内部保留 将数据发送到客户端。如果您的应用程序的输出超过此设置,PHP将以大约您指定的大小的块发送该数据。启用此设置并管理其最大缓冲区大小可能会产生一些有趣的副作用,具体取决于您的应用程序和web服务器。在通过打印或回显发送输出后,您可以发送标题和cookie。如果由于缓冲输出而使服务器发送的数据包比PHP流化输出的数据包少,那么您也会看到性能方面的好处 就这样吧。在生产服务器上,4096字节是一个很好的性能设置 原因

注:输出缓冲也可以通过控制来实现