faileN ответ верен в теории. Без ob_flush()
данные останутся в буфере PHP и не поступят в браузер, пока буфер не будет неявно очищен в конце запроса.
Причина, по которой он все еще не работает, заключается в том, что браузеры также содержат буферы. Данные теперь отправляются корректно, но браузер ждет после получения «единицы», прежде чем он фактически начинает рендеринг. В противном случае при медленном соединении рендеринг страницы будет очень-очень медленным.
Обходной путь (чтобы проиллюстрировать, что он работает правильно), конечно, состоит в том, чтобы отправлять сразу много данных (может быть, какой-то огромный html-комментарий или что-то в этом роде) или использовать такой инструмент, как curl в командной строке.
Если вы хотите использовать этот цикл отправки / ожидания для некоторого пользовательского интерфейса обновления статуса на клиенте, вам нужно будет найти другой способ (например, long-polling и AJAX)