Probleme mit dem Versenden von Headern in PHP

Gestern hatte ich den Auftrag ein Web von einem Provider zu einem anderen umzuziehen. Eigentlich kein Problem, dachte ich, aber es lief nicht. Mal kurz die Fehlermeldungen eingeschaltet:

(„ini_set()“ verwende ich, weil es je nach Konfiguration des Servers vorkommen kann, dass ein einfaches „error_reporting“ nicht ausreicht, um die Fehler im Browser anzuzeigen.)

Und was muss ich sehen: Es gibt Probleme mit dem Header, der nicht gesendet werden konnte, weil eben schon Inhalt zum Browser gesendet wurde – der Klassiker eben.

Das Thema sollte allgemein bekannt sein, erst die Header senden und dann den Inhalt. Wobei Inhalt auch schon ein einziges Leerzeichen oder beispielsweise ein Tabulator sein kann. Was also machen? Die Suche nach der Fehlerquelle in einem umfangreichen Projekt würde Ewigkeiten dauern, von der Nerverei mal ganz abgesehen.

Die Lösung ist dennoch simpel, sie heisst Ausgabepufferung. Dabei wird der gesamte Content, den der Server zum Client schicken möchte erst einmal gepuffert. Die Header werden allerdings trotzdem zum Browser geschickt.

Und so sieht das in der Praxis aus:

Es wird also alles gepuffert was zwischen „ob_start() und ob_end_flush()“ steht und mit der letzten Funktion an den Browser geschickt, wie ich schon schrieb, die Header-Funktion ist davon ausgenommen.

Also ein einfacher Workaround für ein nerviges Problem.

Und wo wir gerade bei Headern sind: Falls Sie ein Redirect mit einem Header machen, und nur so sollte man Redirects machen und nicht mit Meta-Angaben oder Javascript, dann stellen Sie sicher, dass das Script auch nach der Zeile mit dem Redirect abgebrochen wird.

Falls nämlich das Umleiten in die Hose gehen sollte, bricht das Script dort ab und läuft nicht weiter durch. Kann z. B. unangenehm sein, wenn Sie auf einer Seite mit Zugangsbeschränkung den Login-Status abfragen und bei „keiner Berechtigung“ auf eine Login-Seite lenken wollen.

Coding, PHP, Webapplication, Webentwicklung