¿Se ob_start()
utiliza para output buffering
que los encabezados se guarden en el búfer y no se envíen al navegador? ¿Estoy teniendo sentido aquí? Si no, ¿por qué deberíamos usar ob_start()
?
php
output-buffering
Aditya Shukla
fuente
fuente
ob_get_contents()
conob_get_clean()
y eliminaría,ob_end_clean()
ya queob_get_clean()
esencialmente realiza ambas funciones. Referencia: php.net/manual/en/function.ob-get-clean.php (PHP 4> = 4.3.0, PHP 5)ob_start();
¿Es esto correcto? ¿Qué sucede si no está habilitado?ob_end_clean
, ¡funciona de maravilla! Gracias @Riley DuttonLo uso para poder salir de PHP con mucho HTML pero no representarlo. Me ahorra almacenarlo como una cadena que deshabilita la codificación de color IDE.
En vez de:
fuente
ob_get_clean()
, noob_end_clean()
La respuesta aceptada aquí describe qué
ob_start()
hace, no por qué se usa (cuál fue la pregunta que se hizo).Como se indicó en otra parte,
ob_start()
crea un búfer en el que se escribe la salida.Pero nadie ha mencionado que es posible apilar múltiples buffers dentro de PHP. Ver ob_get_level ().
En cuanto al por qué ...
Enviar HTML al navegador en fragmentos más grandes brinda un beneficio de rendimiento de una sobrecarga de red reducida.
Pasar los datos fuera de PHP en fragmentos más grandes proporciona un beneficio de rendimiento y capacidad al reducir la cantidad de cambios de contexto requeridos
Pasar grandes cantidades de datos a mod_gzip / mod_deflate brinda un beneficio de rendimiento ya que la compresión puede ser más eficiente.
el almacenamiento en búfer de la salida significa que aún puede manipular los encabezados HTTP más adelante en el código
La descarga explícita del búfer después de generar [head] .... [/ head] puede permitir que el navegador comience a ordenar otros recursos para la página antes de que se complete la secuencia HTML.
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.
fuente
Lo tienes al revés. ob_start no almacena los encabezados, almacena el contenido. El uso le
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 hayan 'enviado' algo de contenido (es decir, decidir redirigir a la mitad del proceso de representación de una página).
fuente
Yo prefiero:
fuente
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 fuentes de php diferentes, y esas fuentes a menudo, por cualquier motivo, se emiten de diferentes maneras.
A veces tiene contenido html literal que desea enviar directamente al navegador; otras veces la salida se crea dinámicamente (del lado del servidor).
El contenido dinámico siempre (?) Será una cadena. Ahora tiene que combinar este html dinámico en cadena con cualquier html literal directo a mostrar ... en una estructura de nodo html significativa.
Esto generalmente obliga al desarrollador a envolver todo ese contenido directo para mostrar en una cadena (como JD Isaak estaba discutiendo) para que pueda entregarse / insertarse correctamente junto con el html dinámico ... aunque realmente no Lo quiero envuelto.
Pero al usar los métodos ob _ ## puede evitar ese desorden de envoltura de cadenas. El contenido literal es, en cambio, salida al búfer. Luego, en un simple paso, todo el contenido del búfer (todo su html literal) se concatena en su cadena dinámica-html.
(Mi ejemplo muestra la salida literal de html 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).
fuente
Esta función no es solo para encabezados. Puedes hacer muchas cosas interesantes con esto. Ejemplo: podría dividir su página en secciones y usarla así:
Puede capturar la salida que se genera aquí y agregarla en dos lugares totalmente diferentes en su diseño.
fuente
Las siguientes cosas no se mencionan en las respuestas existentes: Configuración del tamaño del búfer Encabezado HTTP y anidamiento.
Configuración del tamaño del búfer para ob_start:
El código anterior mejora el rendimiento del servidor ya que PHP enviará fragmentos de datos más grandes, por ejemplo, 4KB (sin la llamada ob_start, php enviará cada eco al navegador).
Si comienza el almacenamiento en búfer sin el tamaño del fragmento (es decir, un simple ob_start ()), la página se enviará una vez al final del script.
El almacenamiento en búfer de salida no afecta a los encabezados HTTP, se procesan de manera diferente. Sin embargo, debido al almacenamiento en búfer, puede enviar los encabezados incluso después de que se envió la salida, porque todavía está en el búfer.
Bien explicado aquí: https://phpfashion.com/everything-about-output-buffering-in-php
fuente
No, estás equivocado, pero la dirección encaja;)
El buffer de salida almacena la salida de un script. Eso es (en resumen) todo después
echo
oprint
. Lo que pasa con los encabezados es que solo se pueden enviar, si aún no se han enviado. Pero HTTP dice que los encabezados son los primeros de la transmisión. Entonces, si imprime algo por primera vez (en una solicitud), los encabezados se envían y no puede establecer ningún otro encabezado.fuente