PHP中的输出缓冲是什么?

ibps3vxo  于 2023-03-28  发布在  PHP
关注(0)|答案(8)|浏览(113)

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

guz6ccqo

guz6ccqo1#

Output Buffering for Web Developers, a Beginner’s Guide
如果没有输出缓冲(默认),您的HTML将在PHP通过脚本处理时被分段发送到浏览器。使用输出缓冲,您的HTML将存储在变量中,并在脚本结束时作为一个片段发送到浏览器。
输出缓冲对Web开发人员的优势

  • 单独打开输出缓冲会减少下载和呈现HTML所需的时间,因为在PHP处理HTML时,HTML不会被分段发送到浏览器。
  • 我们可以用PHP字符串做的所有花哨的事情,我们现在可以把整个HTML页面作为一个变量来做。
  • 如果您遇到消息“警告:无法修改标头信息-标头已由(output)发送”,您会很高兴知道输出缓冲是您的答案。
siotufzp

siotufzp2#

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 );
    }
?>
yb3bgrhw

yb3bgrhw3#

我知道这是一个老问题,但我想为视觉学习者写我的答案。我找不到任何解释万维网上输出缓冲的图表,所以我自己在Windows mspaint.exe中制作了一个图表。
如果输出缓冲被关闭,那么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

$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

有关输出缓冲区的更多信息及示例,请参见此处:
http://www.hackingwithphp.com/13/0/0/output-buffering

kyxcudwk

kyxcudwk4#

Output Control函数允许您控制何时从脚本发送输出。这在几种不同的情况下都很有用,特别是当您需要在脚本开始输出数据后向浏览器发送头时。Output Control函数不影响使用header()或setcookie()发送的头,只影响echo()等函数和PHP代码块之间的数据。
http://php.net/manual/en/book.outcontrol.php

更多资源:
**第一个e第一个f第一个x

41ik7eoe

41ik7eoe5#

顾名思义,这里的内存缓冲区用于管理脚本的输出显示方式。
以下是主题的一个very good tutorial

3okqufwl

3okqufwl6#

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

aurhwmvo

aurhwmvo7#

更新2019.如果你有专用的服务器和SSD或更好的NVM,3.5GHZ.你不应该使用缓冲,使更快加载网站在100 ms-150 ms.
因为网络比2019年的脚本处理速度慢,性能服务器(服务器,内存,磁盘)和打开APC PHP:)生成脚本有时只需要70 ms,另一次是网络需要时间,从10 ms到150 ms。
所以如果你想快150 ms,缓冲会变慢,因为需要额外的收集缓冲数据,这会增加额外的成本。10年前,当服务器制作1 s脚本时,它是有用的。
请注意output_buffering是有限制的,如果你想用jpg来加载它,它会自动刷新和崩溃发送。
干杯。
你可以使快速河流或你可以使安全塔玛:)

mpbci0fu

mpbci0fu8#

这是php中输出缓冲的总结。(XAMPP php.ini)
输出缓冲是一种控制输出数据量的机制(不包括header和cookie)PHP应该在将该数据推送到客户端之前在内部保留。如果您的应用程序的输出超过此设置,PHP将按照您指定的大小发送数据。打开此设置并管理其最大缓冲区大小可能会产生一些有趣的副作用,具体取决于您的应用程序和Web服务器。在通过print或echo发送输出后,您可以发送header和cookie。如果您的服务器由于缓冲输出而发出的数据包较少,而不是PHP在获得输出时流式传输输出,您还可以看到性能优势。在生产服务器上,出于性能原因,4096字节是一个很好的设置。
注:输出缓冲也可以通过输出缓冲控制功能进行控制。
可能值:
开=启用,缓冲区不受限制。(请谨慎使用)
关闭=禁用
整数=启用缓冲区并设置其最大大小(字节)。
注意:对于CLI SAPI,此指令被硬编码为Off
默认值:关
开发价值:4096
产值:4096
http://php.net/output-buffering output_buffering=4096

相关问题