Мисля, че не си разбрал каква грешка по-точно ти дава. Грешката се поражда от това, че сървърът вече е върнал някакъв резултат до браузърът (т.е. хедърите). Бисквитките(cookies) са част от тези хедъри, а сесиите използват бисквитка за да помнят коя сесия на кой потребител принадлежи (PHPSESSID). PHP парсва всички интервали преди <? или <?php и не изпраща нищо на браузърът.
ob или output buffering е метод за извеждане на информация. Идеята е, че целият код, който отпечатваш и информацията в него се записват първо в паметта на сървъра и след това се изпращат към браузъра, а без него всеки бит, който отпечатваш се изпраща мигновено.
ob е изключително удобен, ако се налага да парснеш html с php в него без да го отпечатваш. Пример за това са съобщенията. С ob можеш да си отпечаташ имейла в паметта и след това с ob_get_clean да получиш резултатът (без да го пращаш към браузъра), който да изпратиш на пощата на потребителя.