Dane wysyłane przez serwer składają się z dwóch rzeczy
- nagłówka (ang. header) w którym są ciasteczka, informacje o sesji itp.
- ciała (ang. body) w którym znajduje sie HTML
Domyślnie wykonanie komendy echo sprawia, że serwer od razu wysyła HTML do klienta a to oznacza, że musi najpierw wysłać nagłówek. Po wysłaniu nagłówka nie jest możliwe już jego modyfikowanie.
U Ciebie prawdopodobnie zachodzi sytuacja, że chcesz modyfikować dane nagłówka, który już został wysłany.
Komenda `ob_start()` sprawia, że `echo` trafia do bufora i jest wysyłane do klienta dopiero po wykonaniu `ob_end_flush()` więc nagłówek wciąż jest niewysłany i można go modyfikować.
http://php.net/manual/en/function.ob-start.php
---
BTW: nauczenie się z jakiegoś frameworka ułatwiło by Ci tworzenie stron.