What is output buffering?

后端 未结 7 2119
不思量自难忘°
不思量自难忘° 2020-11-22 01:49

What is output buffering and why is one using it in PHP?

相关标签:
7条回答
  • 2020-11-22 02:21

    Output Buffering for Web Developers, a Beginner’s Guide:

    Without output buffering (the default), your HTML is sent to the browser in pieces as PHP processes through your script. With output buffering, your HTML is stored in a variable and sent to the browser as one piece at the end of your script.

    Advantages of output buffering for Web developers

    • Turning on output buffering alone decreases the amount of time it takes to download and render our HTML because it's not being sent to the browser in pieces as PHP processes the HTML.
    • All the fancy stuff we can do with PHP strings, we can now do with our whole HTML page as one variable.
    • If you've ever encountered the message "Warning: Cannot modify header information - headers already sent by (output)" while setting cookies, you'll be happy to know that output buffering is your answer.
    0 讨论(0)
  • 2020-11-22 02:32

    The Output Control functions allow you to control when output is sent from the script. This can be useful in several different situations, especially if you need to send headers to the browser after your script has began outputting data. The Output Control functions do not affect headers sent using header() or setcookie(), only functions such as echo() and data between blocks of PHP code.

    http://php.net/manual/en/book.outcontrol.php

    More Resources:

    Output Buffering With PHP

    0 讨论(0)
  • 2020-11-22 02:32
    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
    

    Buffers can be nested, so while one buffer is active, another ob_start() activates a new buffer. So ob_end_flush() and ob_flush() are not really sending the buffer to the output, but to the parent buffer. And only when there is no parent buffer, contents is sent to browser or terminal.

    Nicely explained here: https://phpfashion.com/everything-about-output-buffering-in-php

    0 讨论(0)
  • 2020-11-22 02:33

    I know that this is an old question but I wanted to write my answer for visual learners. I couldn't find any diagrams explaining output buffering on the worldwide-web so I made a diagram myself in Windows mspaint.exe.

    If output buffering is turned off, then echo will send data immediately to the Browser.

    If output buffering is turned on, then an echo will send data to the output buffer before sending it to the Browser.

    phpinfo

    To see whether Output buffering is turned on / off please refer to phpinfo at the core section. The output_buffering directive will tell you if Output buffering is on/off.

    In this case the output_buffering value is 4096 which means that the buffer size is 4 KB. It also means that Output buffering is turned on, on the Web server.

    php.ini

    It's possible to turn on/off and change buffer size by changing the value of the output_buffering directive. Just find it in php.ini, change it to the setting of your choice, and restart the Web server. You can find a sample of my php.ini below.

    ; 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
    

    The directive output_buffering is not the only configurable directive regarding Output buffering. You can find other configurable Output buffering directives here: http://php.net/manual/en/outcontrol.configuration.php

    Example: ob_get_clean()

    Below you can see how to capture an echo and manipulate it before sending it to the browser.

    // 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
    

    Examples: Hackingwithphp.com

    More info about Output buffer with examples can be found here:

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

    0 讨论(0)
  • 2020-11-22 02:33

    As name suggest here memory buffer used to manage how the output of script appears.

    Here is one very good tutorial for the topic

    0 讨论(0)
  • 2020-11-22 02:35

    UPDATE 2019. If you have dedicated server and SSD or better NVM, 3.5GHZ. You shouldn't use buffering to make faster loaded website in 100ms-150ms.

    Becouse network is slowly than proccesing script in the 2019 with performance servers (severs,memory,disk) and with turn on APC PHP :) To generated script sometimes need only 70ms another time is only network takes time, from 10ms up to 150ms from located user-server.

    so if you want be fast 150ms, buffering make slowl, becouse need extra collection buffer data it make extra cost. 10 years ago when server make 1s script, it was usefull.

    Please becareful output_buffering have limit if you would like using jpg to loading it can flush automate and crash sending.

    Cheers.

    You can make fast river or You can make safely tama :)

    0 讨论(0)
提交回复
热议问题