Потоковая печать с PHP

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

Все это работает хорошо, но я случайно обнаружил, что вызов echo или print во время ожидания потоковой передачи данных может также привести к потоковой передаче вывода. В частности, есть несколько страниц результатов, поэтому я получаю доступ к первой странице, читаю и повторно печатаю содержимое, затем перехожу к следующей странице, и, ожидая загрузки этой следующей страницы, содержимое предыдущей страницы становится видимым в браузер.

Чего я не понимаю, так это почему это происходит так непоследовательно. Иногда перед переходом на следующую страницу будет напечатана ровно одна страница, иногда меньше, а иногда и больше. Затем, когда я делаю в основном то же самое впоследствии (читаю на странице, на которую указывает каждый результат), вывод почти не передается в потоковом режиме, перерисовываясь каждую минуту или около того.

Я использую file_get_contents($url) для извлечения содержимого и вызываю функцию с echo для печати того, что уже было загружено. Является ли такое поведение потоковой печати функцией браузера и не зависит от того, что я пишу на PHP? Если нет, то как его лучше контролировать?


person orlade    schedule 17.01.2011    source источник


Ответы (1)


Самое простое решение — использовать буферизацию вывода. Основная идея состоит в том, чтобы вызвать ob_start() в начале вашего сценария, а затем вызвать ob_end_flush(), когда вы хотите, чтобы содержимое страниц было отправлено клиенту. Это сохранит весь ваш вывод, пока вы не захотите, чтобы ваша программа отправила его.

person GWW    schedule 17.01.2011
comment
Спасибо, это, безусловно, то, что я искал, но это все еще не совсем работает, как ожидалось. Я прочитал документацию и комментарии, сто раз сбрасывал все в начале, и после каждой интересной печати у меня вызывалась функция ob_flush(), но она по-прежнему печатается со странными интервалами (каждые 13 результатов, когда их 10 на странице). Может ли быть проблема с размером блока? Я установил 3 байта в php.ini, так что это должно было исправить. Может быть, я должен перезапустить сервер... - person orlade; 17.01.2011
comment
Может проблема в вашем алгоритме? В противном случае я не уверен, почему он будет печатать каждые 13 результатов. Может быть, с вашим веб-сервером происходит что-то странное? - person GWW; 17.01.2011
comment
А, понял. Я должен был позвонить ob_flush();, а затем flush(); (в таком порядке, я полагаю), а не только один или другой, и я должен был делать это каждый раз. Запутанные вещи. Хотя теперь работает отлично, спасибо! - person orlade; 17.01.2011