dedlfix: Die "guten" alten Zeiten...

Beitrag lesen

Tach!

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.

Grund

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?

Nun, die Lösung offenbart sich durch einen Blick in die php.ini. Original ausgeliefert werden jedoch nur php.ini-development und php.ini-production. In beiden steht aber:

; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096

Wenn man nun eine von beiden Datei zur php.ini kopiert/umbenennt und sie wirksam im System platziert, bekommt man es mit 4096 Bytes eingeschaltet. Man kann es aber auch selbst ausschalten oder durch eine von Distributionen oder Hosters vorgefertigte php.ini ausgeschaltet bekommen.

Das heißt also, wenn man das System nicht selbst kontrolliert (hat) kann man sich weder darauf verlassen, dass es aktiv ist, noch dass es ausgeschaltet ist. Zudem könnten auch die 4096 oder wie auch immer konfigurierten Bytes bereits in die Ausgabe geschrieben worden sein.

Wenn man die Umgebung nicht kontrollieren kann, sollte man davon ausgehen, dass es deaktiviert ist, und keine Ausgaben erzeugen, bevor man die Header zusammengestellt hat. Damit ist man auf der sicheren Seite, auch wenn es eingeschaltet und noch Platz im Buffer ist.

Drupal-User können das output-buffering ("ob") aber abschalten…

Jeder kann.

dedlfix.