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.
+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.
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.
Si el búfer de salida está activado, un echomensaje enviará datos al búfer de salida antes de enviarlo al navegador.
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.
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 printor 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 OutputBufferingControl; functions.;PossibleValues:;On=Enabledand buffer is unlimited.(Usewith caution);Off=Disabled;Integer=Enables the buffer and sets its maximum size in bytes.;Note:This directive is hardcoded to Offfor the CLI SAPI
;DefaultValue:Off;DevelopmentValue:4096;ProductionValue: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í:
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.
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.
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 :)
ob_start()
, realmente todo está almacenado. 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 haga que la longitud del búfer sea igual o superior a este tamaño.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:
El ejemplo anterior captura la salida en una variable en lugar de enviarla al navegador. output_buffering está desactivado de forma predeterminada.
Considere este ejemplo:
fuente
ob_flush()
Oob_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.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,
echo
enviará datos de inmediato al navegador.Si el búfer de salida está activado, un
echo
mensaje enviará datos al búfer de salida antes de enviarlo al navegador.phpinfo
Para ver si el búfer de salida está activado / desactivado, consulte phpinfo en la sección principal. La
output_buffering
directiva le dirá si el búfer de salida está activado / desactivado.En este caso, el
output_buffering
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. Simplemente encuéntrelophp.ini
, cámbielo a la configuración que prefiera y reinicie el servidor web. Puede encontrar una muestra de mi aphp.ini
continuación.La directiva
output_buffering
no 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.phpEjemplo: ob_get_clean ()
A continuación puede ver cómo capturarlo
echo
y manipularlo antes de enviarlo al navegador.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
fuente
http://php.net/manual/en/book.outcontrol.php
Más recursos:
Búfer de salida con PHP
fuente
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.
fuente
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()
yob_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
fuente
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 :)
fuente