То, что вы пытаетесь достичь, - это инкрементный вывод в браузер из PHP.
Возможно ли это, зависит от вашего сервера и от того, как вы вызываете PHP.
PHP под FastCGI
Вы, вероятно, немного больше шансов столкнуться с такой проблемой, когда PHP работает под FastCGI, а не как модуль Apache, так как взаимодействие между сервером и процессы PHP не так тесно связаны. Коммуникация FastCGI использует буферизацию вывода после того, как данные оставили процессы PHP, причем вывод отправлен в браузер только после полного завершения запроса или заполнения этого буфера. Вдобавок к этому, процессы PHP, как правило, прекращаются через определенное количество времени, чтобы не позволить кому-либо работать слишком долго.
При этом комбинация ob_end_flush()
(или ob_flush()
) и flush()
должна по-прежнему приводить к тому, что PHP запрашивает сброс нисходящих буферов, поэтому это может по-прежнему работать. Возможно, вам также потребуется выяснить, нужно ли вам ограничивать время для скриптов PHP.
PHP под mod_php
Если вы используете mod_php, вы можете написать пошагово к браузеру. Используйте команду flush(), чтобы убедиться, что модуль PHP мгновенно очистит ее. Если у вас нет буферизации вывода или какого-либо модуля Apache, такого как mod_gzip, он должен немедленно выйти в браузер пользователя. Более того, вы можете поддерживать свой PHP-скрипт до тех пор, как вам нравится (с помощью set_time_limit() в PHP), в соответствии с конфигурациями по умолчанию, хотя, конечно, он будет потреблять некоторую память.
У вас могут возникнуть проблемы с некоторыми браузерами, которые не начинают рендеринг страницы до тех пор, пока не будет загружена определенная часть страницы. Некоторые версии IE могут ждать 1 КБ. Я обнаружил, что Chrome может ждать больше. Множество людей обойти это, добавив дополнение, например длинный комментарий 1 или 2 КБ в верхней части документа.
Ваш браузер и контент? Некоторые браузеры не будут отображать HTML до тех пор, пока не столкнутся с закрывающим тегом. Обычный текст может быть лучшим вариантом, если вы хотите «живое обновление» контента. – mwalker
Это похоже на проблему, с которой лучше справиться на стороне клиента. Вы можете получать с сервера с помощью AJAX каждую секунду. –
это абсолютно то, что НЕ должно быть сделано так, как вы пытаетесь на сервере .. используйте некоторые ajax и setTimeout или такие в браузере вместо этого. –