Остановить буферизацию вывода PHP

Мне нужно отображать непрерывный вывод из моего php-скрипта. Сценарий будет оставаться в цикле печати данных журнала с устройства и переходить в спящий режим. Моя проблема в том, что я не могу заставить PHP или Apache выводить данные до завершения скрипта.

Я перепробовал все команды для очистки выходного буфера и прочитал конфигурационные файлы как для PHP, так и для Apache в поисках какого-либо типа буферизации, который нужно отключить.

Возможно ли это сделать с Apache и PHP в Windows, или мне следует рассмотреть какую-то другую платформу?


person Torstein    schedule 24.06.2010    source источник


Ответы (3)


Лучший способ (наиболее надежный и чистый) сделать это — использовать сценарий на стороне сервера, который выполняет эту работу, и сценарий AJAX на стороне клиента, который будет опрашивать другой сценарий на стороне сервера, который вернет статус. В вебе данные буферизуются на разных уровнях, чтобы добиться оптимизации, и поэтому трудно добиться того, чего вы хотите.

person Palantir    schedule 24.06.2010
comment
Да, я думал об опросе клиентов через регулярные промежутки времени, но я пытался избежать ненужных задержек, но я выберу этот подход, если ничего другого не получится. - person Torstein; 24.06.2010
comment
Наоборот, это должно дать вашему клиенту лучшую, а не худшую производительность: если вы будете следовать своему подходу, вы никогда не будете уверены, когда будет выводиться текст, потому что это будет зависеть от реализации браузера. Наоборот, с подходом AJAX, если вы опрашиваете с интервалом в 1 секунду, вы будете уверены, что клиент будет обновляться каждую 1 секунду, что должно быть достаточно для любого веб-пользователя. - person Palantir; 24.06.2010

Используйте эти команды очистки выходного буфера, которые вы уже использовали, и добавьте комментарий HTML длиной 1024 байта. Потому что скорее всего проблема в браузере, а не в сервере.

Ах, похоже, вы ищете приложение COMET.

http://www.zeitoun.net/articles/comet_and_php/start

person Your Common Sense    schedule 24.06.2010

Настройка PHP output_buffering по умолчанию равна 0 (т. е. выключена), но вы, несомненно, исследовали это.

Я думаю, что @Palantir's предложение, вероятно, хорошее: писать записи журнала в локальный файл, а затем передать этот файл (или его части) клиенту; клиент может повторно запросить сколько угодно раз. Это также имеет то преимущество, что не заполняет буфер браузера (т. е. вы не должны просто продолжать отправлять данные журнала клиенту до бесконечности).

Но это был не ваш вопрос.

Можете ли вы воспроизвести проблему буферизации вывода с помощью простого сценария, подобного следующему?

<?php
while (TRUE)
{
    echo 'x';
    flush();
    sleep(1);
}
?>
person Sam Wilson    schedule 24.06.2010
comment
Я пробовал такой простой скрипт, но он не дал мне никакого результата. - person Torstein; 24.06.2010