Abhimanyu
¿Qué es el almacenamiento en búfer de salida y por qué lo usaría en PHP?
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 paraob_start()
,int $chunk_size
que, 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
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()
oob_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
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.
Si el búfer de salida está activado, entonces un echo
enviará datos al búfer de salida antes de enviarlos al navegador.
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.
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í:
-
Pregunta, ¿necesito tener display_errors activado para que se capture este búfer?
– Matías
12 mayo 2022 a las 13:30
-
display_errors
youtput_buffering
son dos cosas diferentes. Corrígeme si me equivoco, configurandodisplay_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:
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
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 🙂