¿Qué es el almacenamiento en búfer de salida en PHP?

8 minutos de lectura

Avatar de usuario de Abhimanyu
Abhimanyu

¿Qué es el almacenamiento en búfer de salida y por qué lo usaría en PHP?

avatar de usuario de ax.
hacha.

Búfer de salida para desarrolladores web, una guía para principiantes:

Sin almacenamiento en búfer de salida (el valor predeterminado), su HTML se envía al navegador en partes a medida que PHP procesa a través de su secuencia de comandos. Con el almacenamiento en búfer de salida, su HTML se almacena en una variable y se envía al navegador como una sola pieza al final de su secuencia de comandos.

Ventajas del almacenamiento en búfer de salida para desarrolladores web

  • Activar el búfer de salida por sí solo reduce la cantidad de tiempo que lleva descargar y renderizar nuestro HTML porque no se envía al navegador en partes mientras PHP procesa el HTML.
  • Todas las cosas sofisticadas que podemos hacer con cadenas PHP, ahora podemos hacerlas con toda nuestra página HTML como una variable.
  • Si alguna vez se encontró con el mensaje “Advertencia: no se puede modificar la información del encabezado; los encabezados ya fueron enviados por (salida)” mientras configuraba las cookies, le alegrará saber que el almacenamiento en búfer de salida es su respuesta.

  • +1. Aquí hay otro enlace útil: php.net/manual/en/function.ob-start.php – también es útil cuando se trata de una función que repite un valor que preferiría almacenar en una variable.

    – Cámara

    14 de mayo de 2010 a las 6:21


  • ¿Realmente todo está almacenado en el búfer hasta el final, o la página solo vendrá en fragmentos si tengo una página muuuy larga?

    – zedoo

    14 de mayo de 2010 a las 7:02


  • @zedoo si inicia el almacenamiento en búfer de salida con ob_start(), realmente todo está amortiguado. hay un segundo parámetro opcional para ob_start(), int $chunk_sizeque, si se establece, hará que el búfer se vacíe después de cualquier llamada de salida que provoque que la longitud del búfer sea igual o supere este tamaño.

    – hacha

    14 de mayo de 2010 a las 7:24


  • Si recibe “Advertencia: no se puede modificar la información del encabezado”, eso significa que primero debe auditar su código, ya que habilitar el almacenamiento en búfer de salida es una solución al síntoma y no a la causa. Algo está escribiendo antes de su turno. Así que no estoy de acuerdo, pero no lo suficiente como para rechazar la respuesta.

    – Glenn Plas

    2 de julio de 2013 a las 18:06

  • Solo veo ventajas de usar el almacenamiento en búfer, entonces, ¿por qué no está habilitado de forma predeterminada en php?

    – Tomás Banderas

    31 de enero de 2017 a las 2:15


Avatar de usuario de Salman A
salman a

Búfer de salida es utilizado por PHP para mejorar el rendimiento y realizar algunos trucos.

  • Puede hacer que PHP almacene todos los resultados en un búfer y generarlos todos a la vez, lo que mejora el rendimiento de la red.

  • Puede acceder al contenido del búfer sin enviarlo de vuelta al navegador en ciertas situaciones.

Considere este ejemplo:

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>

El ejemplo anterior captura la salida en una variable en lugar de enviarla al navegador. output_buffering está desactivado de forma predeterminada.

  • Puede utilizar el almacenamiento en búfer de salida en situaciones en las que desea modificar encabezados después de enviar contenido.

Considere este ejemplo:

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

  • La misma pregunta aquí que para Axe: ¿no está comenzando el almacenamiento en búfer de salida sin volver a apagarlo más tarde, lo que hará que su secuencia de comandos se encuentre con todo tipo de problemas?

    – Edward Stumperd

    24/09/2012 a las 21:28

  • El búfer se descarga cuando llama a uno de los métodos de descarga (p. ej. ob_flush() o ob_end_flush()). El contenido del búfer también se vacía cuando finaliza la secuencia de comandos, de forma abrupta o de otro modo, por lo que no debería haber ningún problema.

    – Salmán A.

    25 de septiembre de 2012 a las 6:09

Avatar de usuario de Julian
Julian

Sé que esta es una vieja pregunta, pero quería escribir mi respuesta para estudiantes visuales. No pude encontrar ningún diagrama que explicara el almacenamiento en búfer de salida en la web mundial, así que hice un diagrama yo mismo en Windows mspaint.exe.

Si el búfer de salida está desactivado, entonces echo enviará datos inmediatamente al Navegador.

ingrese la descripción de la imagen aquí

Si el búfer de salida está activado, entonces un echo enviará datos al búfer de salida antes de enviarlos al navegador.

ingrese la descripción de la imagen aquí

phpinfo

Para ver si el almacenamiento en búfer de salida está activado o desactivado, consulte phpinfo en la sección principal. El output_buffering directiva le dirá si el almacenamiento en búfer de salida está activado/desactivado.

ingrese la descripción de la imagen aquí

En este caso el output_buffering el valor es 4096, lo que significa que el tamaño del búfer es de 4 KB. También significa que el almacenamiento en búfer de salida está activado en el servidor web.

php.ini

Es posible activar/desactivar y cambiar el tamaño del búfer cambiando el valor de la output_buffering directiva. Solo encuéntralo en php.ini, cámbielo a la configuración de su elección y reinicie el servidor web. Puedes encontrar una muestra de mi php.ini abajo.

; 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

la directiva output_buffering no es la única directiva configurable con respecto al almacenamiento en búfer de salida. Puede encontrar otras directivas de almacenamiento en búfer de salida configurables aquí: http://php.net/manual/en/outcontrol.configuration.php

Ejemplo: ob_get_clean()

A continuación puede ver cómo capturar un echo y manipularlo antes de enviarlo al navegador.

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

Ejemplos: Hackingwithphp.com

Puede encontrar más información sobre el búfer de salida con ejemplos aquí:

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

  • Pregunta, ¿necesito tener display_errors activado para que se capture este búfer?

    – Matías

    12 mayo 2022 a las 13:30

  • display_errors y output_buffering son dos cosas diferentes. Corrígeme si me equivoco, configurando display_errors a "1" no es necesario.

    – Julian

    17 de mayo de 2022 a las 9:25

Las funciones de control de salida le permiten controlar cuándo se envía la salida desde el script. Esto puede ser útil en varias situaciones diferentes, especialmente si necesita enviar encabezados al navegador después de que su secuencia de comandos haya comenzado a generar datos. Las funciones de control de salida no afectan los encabezados enviados mediante header() o setcookie(), solo funciones como echo() y datos entre bloques de código PHP.

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

Más recursos:

Búfer de salida con PHP

Como sugiere el nombre aquí, el búfer de memoria se usa para administrar cómo aparece la salida del script.

Acá hay uno muy buen tutorial para el tema

Avatar de usuario de Eje
eje

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

Los búferes se pueden anidar, de modo que mientras un búfer está activo, otro ob_start() activa un nuevo búfer. Entonces ob_end_flush() y ob_flush() en realidad no están enviando el búfer a la salida, sino al búfer principal. Y solo cuando no hay un búfer principal, el contenido se envía al navegador o terminal.

Muy bien explicado aquí: https://phpfashion.com/todo-sobre-el-buffering-de-salida-en-php

ACTUALIZACIÓN 2019. Si tiene servidor dedicado y SSD o mejor NVM, 3.5GHZ. No debe usar el almacenamiento en búfer para hacer que el sitio web se cargue más rápido en 100ms-150ms.

Debido a que la red es más lenta que procesar el script en 2019 con servidores de rendimiento (servidores, memoria, disco) y con APC PHP activado 🙂 Para generar el script, a veces solo se necesitan 70 ms, en otro momento, solo la red lleva tiempo, desde 10 ms hasta 150 ms desde la ubicación usuario-servidor.

Entonces, si desea ser rápido 150 ms, el almacenamiento en búfer se hace lento, porque necesita datos de búfer de recopilación adicionales, lo que genera un costo adicional. Hace 10 años, cuando el servidor creó el script 1s, fue útil.

Tenga cuidado de que output_buffering tenga un límite si desea usar jpg para cargarlo, puede vaciar la automatización y fallar el envío.

Salud.

Puedes hacer río rápido o puedes hacer tama con seguridad 🙂

¿Ha sido útil esta solución?