Es común no saber de dónde proviene el error "Headers already sent" cuando lo vemos en el log de errores o en alguna parte del sitio como tal. Sin embargo, típicamente el error proviene porque:
Las funciones que envían o modifican HTTP Headers deben ser invocadas ANTES de cualquier output.
Algunas funciones para modificar los HTTP Headers son:
- header / header_remove
- session_start / session_regenerate_id
- setcookie / setrawcookie
Un Output puede ser:
- Sin intención:
- Espacio en blanco ANTES de <¿php or después de ?>
- Mensajes de Error Previos
- UTF-8 Byte Order Mark (caracter invisible a la mayoría de los procesadores de texto pero que implica error)
- Intencionales:
- print, echo o alguna otra función que produzca un Output
- Secciones <html> antes del código <?php
¿Cómo encontrar el dónde ocurrió el Output prematuro?
Tendremos un error como éste:
Warning: Cannot modify header information - headers already sent by (output started at /home/usuario/public_html/index.php:2) in /home/usuario/public_html/index.php on line 17.
Punto 1: En dicho mensaje de error podemos saber que en la línea 17 es donde el Header es invocado con fallo.
Punto 2: Donde comienza el parentésis con la mención del Output encontraremos la línea donde está el Output prematuro. En este caso, en la línea 2.
Es importante definir con tu programador o diseñador cuál es la razón concreta de tu caso.