2011-01-17 3 views
1

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

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

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

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

ответ

5

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

+0

Спасибо, это, безусловно, похоже на то, что я искал, но он все еще не работает должным образом. Я прочитал документацию и комментарии, покраснел все сто раз с самого начала и получил ob_flush() после каждого интересного отпечатка, но он по-прежнему печатает на странные интервалы (каждые 13 результатов, когда их 10 на странице). Может быть проблема с размером куска? Я установил его в 3 байта в php.ini, так что это должно было исправить его. Возможно, я должен перезапустить сервер ... – orlade

+0

Может ли быть проблема с вашим алгоритмом? В противном случае я не уверен, почему он будет печатать каждые 13 результатов. Может быть, есть что-то странное с вашим веб-сервером? – GWW

+1

А, понял. Мне пришлось называть 'ob_flush();' и затем 'flush();' также (в этом порядке, я считаю), а не только один или другой, и я должен был делать это каждый раз. Путаница. Отлично работает сейчас, спасибо! – orlade