¿Qué es el buffering de salida?

Respuestas:

274

Almacenamiento intermedio de salida para desarrolladores web, una guía para principiantes :

Sin el 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 script. Con el almacenamiento en búfer de salida, su HTML se almacena en una variable y se envía al navegador como una 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 solo disminuye la cantidad de tiempo que lleva descargar y renderizar nuestro HTML porque no se envía al navegador en pedazos mientras PHP procesa el HTML.
  • Todas las cosas elegantes que podemos hacer con cadenas PHP, ahora podemos hacerlo con toda nuestra página HTML como una variable.
  • Si alguna vez ha encontrado el mensaje "Advertencia: no se puede modificar la información del encabezado: encabezados ya enviados por (salida)" al configurar las cookies, le alegrará saber que el búfer de salida es su respuesta.
hacha.
fuente
66
+1. Aquí hay otro enlace útil: php.net/manual/en/function.ob-start.php , también útil cuando se trata de una función que tiene un valor que preferiría almacenar en una variable.
Cam
¿Realmente está todo almacenado hasta el final, o la página simplemente se dividirá en pedazos si tengo una página realmente larga?
zedoo
55
@zedoo si comienzas el buffering de salida ob_start(), realmente todo está almacenado. 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 haga que la longitud del búfer sea igual o superior a este tamaño.
hacha
12
Si aparece "Advertencia: no se puede modificar la información del encabezado", significa que primero debe auditar su código, ya que habilitar el almacenamiento en búfer de salida es una solución del síntoma y no 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
55
Solo veo las ventajas de usar el almacenamiento en búfer, entonces, ¿por qué no está habilitado de forma predeterminada en php?
Thomas Banderas
69

PHP utiliza el buffering de salida para mejorar el rendimiento y realizar algunos trucos.

  • Puede hacer que PHP almacene todos los resultados en un búfer y los envíe a la vez para mejorar el rendimiento de la red.

  • Puede acceder al contenido del búfer sin devolverlo al navegador en determinadas 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 usar 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 );
    }
?>
Salman A
fuente
La misma pregunta aquí que para Axe: ¿no está iniciando el búfer de salida sin desactivarlo más tarde, va a hacer que su script se encuentre con todo tipo de problemas?
Edward Stumperd
1
El búfer se vacía cuando se 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 el script, de forma abrupta o no, por lo que no debería haber ningún problema.
Salman A
17

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 red mundial, así que hice un diagrama en Windows mspaint.exe.

Si el búfer de salida está desactivado, echoenviará datos de inmediato al navegador.

ingrese la descripción de la imagen aquí

Si el búfer de salida está activado, un echomensaje enviará datos al búfer de salida antes de enviarlo al navegador.

ingrese la descripción de la imagen aquí

phpinfo

Para ver si el búfer de salida está activado / desactivado, consulte phpinfo en la sección principal. La output_bufferingdirectiva le dirá si el búfer de salida está activado / desactivado.

ingrese la descripción de la imagen aquí En este caso, el output_bufferingvalor 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_bufferingdirectiva. Simplemente encuéntrelo php.ini, cámbielo a la configuración que prefiera y reinicie el servidor web. Puede encontrar una muestra de mi a php.inicontinuación.

; 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_bufferingno es la única directiva configurable con respecto a la memoria intermedia de salida. Puede encontrar otras directivas de 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 capturarlo echoy 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 buffer de salida con ejemplos aquí:

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

Julian
fuente
9

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 script haya comenzado a generar datos. Las funciones de control de salida no afectan a 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

Sarfraz
fuente
4

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

Aquí hay un muy buen tutorial para el tema.

nik
fuente
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

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()realmente no estamos enviando el búfer a la salida, sino al búfer principal. Y solo cuando no hay búfer principal, el contenido se envía al navegador o terminal.

Bien explicado aquí: https://phpfashion.com/everything-about-output-buffering-in-php

sudip
fuente
0

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

Debido a que la red es más lenta que el proceso de secuencia de comandos en el 2019 con servidores de rendimiento (servidores, memoria, disco) y enciende APC PHP :) Para que la secuencia de comandos generada a veces solo necesite 70 ms, otra vez solo la red lleva tiempo, desde 10 ms hasta 150 ms desde la ubicación usuario-servidor.

así que si quiere ser rápido 150ms, el almacenamiento en búfer se ralentiza, ya que necesita datos adicionales del búfer de recolección, tiene un costo adicional. Hace 10 años, cuando el servidor creaba el script 1s, era útil.

Tenga en cuenta que output_buffering tiene límite si desea usar jpg para cargarlo, puede automatizar el envío y bloquear el envío.

Salud.

Puedes hacer river rápido o puedes hacer tama de forma segura :)

Kamil Dąbrowski
fuente