2010-05-27 12 views
6

Veo (no solo en este sitio) una gran cantidad de preguntas de programadores sin experiencia sobre el infame "encabezados ya enviados ... salida comenzó en" error , y muchas personas sugieren utilizar el buffer de salida como una solución.Caso de uso para el búfer de salida como la solución correcta para "encabezados ya enviados"

En mi experiencia, nunca he encontrado una situación en la que ese error no haya sido causado por un error en la lógica del programa. ¿Hay casos en que el almacenamiento en búfer de salida es realmente la solución correcta?

Respuesta

4

Estoy de acuerdo con su declaración inicial. En general, resolver el problema de los "encabezados" con el buffer de salida es una medida provisional.

La parte realmente triste/divertida de esta solución es: ¿qué sucede cuando quieres producir algo grande, como un archivo que tienes detrás de un muro de pago? Por lo general, resulta en personas que reemplazan el problema de "encabezados" con sus scripts que se quedan sin memoria.

Whoops.

0

para sistemas de plantilla que necesitará ob_start ... mira y Zend_View

Posteriormente Editar no he entendido bien la pregunta y proporcionó un caso en el que el uso ob_start es una solución válida.

+0

¿Se puede elaborar? –

+0

Verdadero, los sistemas de plantillas lo necesitan. Sin embargo, la pregunta se refiere a situaciones de "encabezados ya enviados". – deceze

+1

solomongaby implica que algunos sistemas de plantillas utilizan el almacenamiento en búfer de salida para procesar fragmentos de la plantilla que se fusionarán en algún paso posterior de la representación.Sin embargo, aunque este es un uso válido del almacenamiento en búfer de salida, no es una explicación de por qué el almacenamiento en búfer podría ser una forma válida de resolver el problema de "encabezados" que es la pregunta original. – ivans

2

La única situación que puedo imaginar es un CMS o weblog en el que los plugins pueden ser invocadas en el código HTML, como

<h1>My images</h1> 
{plugin:show_images} 

esos plugins que tenga que añadir sus propias hojas de estilo y otras cosas que van en la sección <head> de la página. Usando el almacenamiento en búfer, esto sería posible.

En la práctica, sin embargo, esto no es bueno para el rendimiento, se siente pesado y no funciona cuando el almacenamiento en búfer de salida está desactivado. Incluso aquí, es mejor preprocesar los contenidos antes de mostrarlos y hacer cualquier adición de hojas de estilo, etc. antes de que salga algo.

+1

Creo que estás hablando de un problema diferente. HTML es diferente del encabezado HTTP. –

+1

@ZZ Coder no, estoy hablando de insertar código en un lugar que está "por encima" del lugar que está procesando en este momento. Si esa es una posición diferente dentro del elemento '' o '' realmente no importa. El objetivo es utilizar el almacenamiento en búfer para modificar el resultado antes de enviarlo. –

+0

@Pekka 웃 De lo que realmente no se trataba la pregunta. – immibis

0

Es posible que desee emitir redireccionamientos HTTP al final del flujo, por ejemplo, en plantillas o manejo de excepciones. (Por supuesto, un marco con plantillas o gestión global de excepciones necesitaría buffer de salida de todos modos, por lo que podría decirse que no es una solución a este problema específicamente).

0

En mi experiencia, nunca he encontrado una situación donde ese error no fue causado por un flujo en la lógica del programa. ¿Hay casos en que el almacenamiento en búfer de salida es realmente la solución correcta?

Tendría que estar de acuerdo con usted, sin embargo:

1) Una de las razones que me gusta PHP es porque le permite elegir cómo resolver el problema

2) hay otra usos para output_buffering que no sea la fijación del mensaje 'Encabezados ya enviados' - por ejemplo comprimir la salida, capturar la salida del código arbitrario, evitar la codificación fragmentada ....

C.

Cuestiones relacionadas