You don't need to buffer output.
flush() works fine on its own, you just have to send enough data to force a flush.
<?php
for ($i = 1; $i <= 5; $i++)
{
echo $i . '<br>';
echo str_pad('',9096)."\n";
flush();
sleep(2);
}
You'll have to play around with the data amount, but for just a single digit and line break, I had to use 9096 to get it to work in Safari. Some say 4096 should be enough, but that was not enough for Safari (it flushed every 2 loops then).