¿De qué sirve ob_start () en php?

¿ ob_start() utiliza ob_start() para output buffering manera que los encabezados estén almacenados en un búfer y no se envíen al navegador? ¿Estoy teniendo sentido aquí? Si no, ¿por qué deberíamos usar ob_start() ?

Piense en ob_start() como diciendo “Comience recordando todo lo que normalmente saldría, pero aún no hace nada con eso”.

Por ejemplo:

 ob_start(); echo("Hello there!"); //would normally get printed to the screen/output to browser $output = ob_get_contents(); ob_end_clean(); 

Hay otras dos funciones con las que normalmente se ob_get_contents() : ob_get_contents() , que básicamente le proporciona lo que se ha “guardado” en el búfer desde que se activó con ob_start() , y luego ob_end_clean() o ob_flush() , que deja de guardar cosas y descarta lo que se guardó, o deja de guardar y lo emite todo a la vez, respectivamente.

Utilizo esto para poder salir de PHP con una gran cantidad de HTML pero no renderizarlo. Me ahorra almacenarlo como una cadena que deshabilita la encoding de colores.

  
text link

En lugar de:

  text link 
'; ?>

La respuesta aceptada aquí describe qué hace ob_start() , no por qué se usa (cuál fue la pregunta).

Como se indica en otra parte, ob_start() crea un búfer en el que se escribe la salida.

Pero nadie ha mencionado que es posible acumular múltiples búferes dentro de PHP. Ver ob_get_level ().

En cuanto al porqué …

  1. Enviar HTML al navegador en trozos más grandes brinda un beneficio de rendimiento a partir de una sobrecarga de red reducida.

  2. Al pasar los datos de PHP en fragmentos más grandes, se obtiene un beneficio de rendimiento y capacidad al reducir la cantidad de cambios de contexto requeridos.

  3. Pasar fragmentos más grandes de datos a mod_gzip / mod_deflate brinda un beneficio en el rendimiento ya que la compresión puede ser más eficiente.

  4. el almacenamiento en búfer de la salida significa que todavía puede manipular los encabezados HTTP más adelante en el código

  5. La descarga explícita del búfer después de la salida de [head] …. [/ head] puede permitir que el navegador comience a ordenar otros recursos para la página antes de que se complete la secuencia HTML.

  6. La captura de la salida en un búfer significa que puede redirigirse a otras funciones, como el correo electrónico, o copiarse a un archivo como una representación en caché del contenido

Lo tienes al revés ob_start no almacena en búfer los encabezados, sino que almacena el contenido. El uso de ob_start permite mantener el contenido en un búfer del lado del servidor hasta que esté listo para mostrarlo.

Esto se usa comúnmente para que las páginas puedan enviar encabezados “después” de que ya hayan “enviado” algún contenido (es decir, que decidan redirigir a la mitad del proceso de renderización de una página).

esto es para aclarar aún más la respuesta de JD Isaaks …

El problema con el que se encuentra a menudo es que está utilizando php para generar html desde muchas fonts de php diferentes, y esas fonts a menudo, por cualquier razón, se envían de diferentes formas.

Algunas veces tiene contenido html literal que desea enviar directamente al navegador; otras veces la salida se crea dinámicamente (en el lado del servidor).

El contenido dynamic siempre (?) Va a ser una cadena. Ahora debe combinar este html dynamic codificado con cualquier html literal, directo a visualización … en una estructura de nodo html significativa.

Esto generalmente obliga al desarrollador a envolver todo ese contenido directo en una cadena (como JD Isaak estaba discutiendo) para que pueda ser entregado / insertado apropiadamente junto con el html dynamic … aunque realmente no lo haga lo quiero envuelto.

Pero al usar los métodos ob _ ## puedes evitar ese desastre envolvente. El contenido literal es, en cambio, salida al búfer. Luego, en un solo paso, todo el contenido del búfer (todo su html literal) se concatena en su cadena dynamic-html.

(Mi ejemplo muestra que html literal se envía al búfer, que luego se agrega a una cadena html … mire también el ejemplo de JD Isaaks para ver string-wrapping-of-html).

 html
" ; $lvs_html .= gf_component_assembler__without_ob( ) ; $lvs_html .= "
more html
" ; $lvs_html .= "----
" ; $lvs_html .= "
html
" ; $lvs_html .= gf_component_assembler__with_ob( ) ; $lvs_html .= "
more html
" ; echo $lvs_html ; // 02 - component contents // html // 01 - component header // 03 - component footer // more html // ---- // html // 01 - component header // 02 - component contents // 03 - component footer // more html //--------------------------------- function gf_component_assembler__without_ob( ) { $lvs_html = "
01 - component header
" ; // " ; include( "component_contents.php" ) ; $lvs_html .= "
03 - component footer
" ; //
" ; return $lvs_html ; } ; //--------------------------------- function gf_component_assembler__with_ob( ) { $lvs_html = "
01 - component header
" ; // " ; ob_start(); include( "component_contents.php" ) ; $lvs_html .= ob_get_clean(); $lvs_html .= "
03 - component footer
" ; //
" ; return $lvs_html ; } ; //--------------------------------- ?>

  
02 - component contents

Yo prefiero:

 ob_start(); echo("Hello there!"); $output = ob_get_clean(); //Get current buffer contents and delete current output buffer 

Esta función no es solo para encabezados. Puedes hacer muchas cosas interesantes con esto. Ejemplo: puedes dividir tu página en secciones y usarla así:

 $someTemplate->selectSection('header'); echo 'This is the header.'; $someTemplate->selectSection('content'); echo 'This is some content.'; 

Puede capturar la salida que se genera aquí y agregarla en dos lugares totalmente diferentes en su diseño.

No, estás equivocado, pero la dirección encaja;)

El buffer de salida almacena el resultado de un script. Eso es (en resumen) todo después de echo o print . Lo que pasa con los encabezados es que solo pueden enviarse, si aún no han sido enviados. Pero HTTP dice que los encabezados son los primeros de la transmisión. Por lo tanto, si muestra algo por primera vez (en una solicitud), los encabezados se envían y no puede establecer otros encabezados.

Intereting Posts