Обрати внимание на второй параметр функции ob_start - chunk_size - максимальный размер буфера. Если он не задан, то в callback-функцию данные передаются все и в конце (т.е. на первом ob_end...). Вполне возможно что срабатывает некое ограничение в твоей функции.
Попробуй установи это параметр равным, например 4096. Тогда callback-функция вызываться для каждых 4кБ полученных данных. Правда при этом результат её работы отправляется сразу в браузер.