ob_start()
Эта функция включает буферизацию вывода. Если буферизация вывода активна, никакой вывод скрипта не отправляется (кроме заголовков), а сохраняется во внутреннем буфере.
Содержимое этого внутреннего буфера может быть скопировано в строковую переменную, используя ob_get_contents(). Для вывода содержимого внутреннего буфера следует использовать ob_end_flush(). В качестве альтернативы можно использовать ob_end_clean() для очистки содержимого буфера.
Если вы убираете ob_start, выводите какой-то текст или теги, а потом пытаетесь вывести заголовок - получаете ошибку, что заголовки уже отправлены. Они же заголовки, они должны в начале идти, ну!