El segundo caso es completamente válido.
Puedes utilizar o poner el código php que necesitas antes de las cabeceras, pero con la restricción de no mostrar nada por pantalla.
Si lees sobre
header en el manual encontrarás este parrafo:
Cita: Recuerde que header() debe ser llamado antes de mostrar nada por pantalla, etiquetas HTML, líneas en blanco desde un fichero o desde PHP. Es un error muy común leer código con funciones como include o require, u otro tipo de funciones de acceso de ficheros que incluyen espacios o líneas en blanco que se muestran antes de llamar a la función header(). Sucede el mismo problema cuando se utiliza un solo fichero PHP/HTML.