ursus contionabundo: Die "guten" alten Zeiten...

Beitrag lesen

und bei PHP immer dran denken: Sobald das erste Byte vom Body geschrieben wurde, lässt sich an den Headern nichts mehr tun.

Das "immer" galt in den "guten" alten Zeiten. Seit PHP (wohl) Version 5.6 braucht es jedenfalls für PHP, welches nicht als CLI ausgeführt wird, im folgenden Beispiel das ob_start() nicht mehr:

Das stimmt so absolut auch wieder nicht.

Doch. Das von mir im Zitat absichtlich betonte "immer" stimmt absolut nicht.

Wenn du aber mal nach oben rollst, siehst du, dass der Default-Wert 0 ist, und damit das Output-Buffering ausgeschaltet ist. Ist das nicht widersprüchlich?

Widersprüchlich ist die Dokumentation bzw. das Verhalten der Entwickler:

In meiner, von mir nicht geänderten Fassung von /etc/php/7.3/apache2/php.ini

; output_buffering
;   Default Value: Off
;   Development Value: 4096
;   Production Value: 4096

und, weiter unten:

; 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
; http://php.net/output-buffering
output_buffering = 4096

Das entspricht z.B. auch dem Originaldownload "php-7.3.3.tar.bz2", darin der "php.ini-production" in den Blöcken ab den Zeilen 126 bzw. 203.

Soll heißen, die Entwickler benutzen den im Programm selbst bestimmten default-value "off" in den mit gelieferten ini-Dateien selbst gerade nicht und überschreiben ihn - übrigens auch in der "php.ini-development".

Das "This directive is hardcoded to Off for the CLI SAPI" hatte ich mit anderen Worten erwähnt.