Das könnte höchstens dann schiefgehen, wenn vor dem header-Aufruf eine andere Ausgabe gemacht wurde, die dazu führte, dass die Header bereits gesendet wurden. In dem Fall ist ein header-Aufruf wirkungslos.
Jein. Genauer: Regelmäßig schon seit einigen PHP-Versionen nicht mehr unbedingt. Schon eine ganz Weile ist das „output-buffering“ (nur nicht in der Shell-Umgebung also „CLI-SAPI“, da gibt es keine Header) standardmäßig aktiviert - die Ausgaben gehen erst nach Ende des Skriptes (oder bei Erreichen der in der php.ini gesetzten Grenze) „raus“ und die Headerzeilen können von PHP also (womöglich!) noch ersetzt werden.
; Output buffering is a mechanism for controlling how much output data
; (excluding headers and cookies) PHP should keep internally before pushing that
; data to the client. If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
; functions.
; Possible Values:
; On = Enabled and buffer is unlimited. (Use with caution)
; Off = Disabled
; Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; https://php.net/output-buffering
output_buffering = 4096
(Auszug aus meiner originalen PHP.ini)