Hola
rafamele,
Excelente comentario y muy completo te han hecho.
Suponte que tu programas una página web o una aplicación con php.
Cuando cualquier visitante llegue a tu web, ya sea con firefox, internet explorer, nestcape, etc, en fin, cualquier navegador, y escriba tu URL (el de tu pagina o sitio web), entonces se envía una petición desde tu navegador al servidor.
El servidor procesa la peitción, ejecuta el motor php para interpretar tus script y devuelve al navegador del visitante una respuesta.
Pues bien, "la respuesta" se envía (didácticamente hablando) en
dos partes, - Primero las cabeceras - Luego texto html, javascript, css, etc, todo lo que conponga tu web (el resultado de la ejecución del php tambien que es en html).
Se debe respetar ese orden si o si. Si ya has enviado algun caracter html o simplemente un espacio, ya no se pueden enviar cabeceras.
Desde php las cabeceras se envían con la función header().
Si haces un header() depsues que ya enviaste algun caractes o espacio al navegador te da el error.
Se entiende?
Ahora... si quieres olvidarte del problema y hacer salidas html y al final hacer un header() sin errores entonces hay una forma:
En el comienzo de tu script pon esto:
ob_start("ob_gzhandler");
y al final por esto:
ob_end_flush();
quedaría así:
Código PHP:
<?php
ob_start("ob_gzhandler");
// TODO TU CODIGO...
ob_end_flush();
?>
Lo que estamos haciendo es, además de comprimir toda la salida al navegador, es indicarle que no envie nada de html, espacios hasta termionar de ejecutarse el script (porque esta comprimiendo la salida). Entonces en este caso donde pongas el header() va a funcionar bien.
Espero haber sido util...
Salud!