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

Динамический вывод в PHP-скрипте

Все мы знаем, что PHP - это серверный язык. И у него есть особенность вывода информации, например, с помощью echo. Эта особенность заключается в том, что функции вывода (в том числе и операторы) отправляют информацию не сразу на вывод, а сначала в выходной поток. Этот выходной поток можно представить как трубу (или буфер), в которой накапливается выходная информация. Все echo, print и прочие выходные функции и операторы отправляют данные в эту самую трубу. И только после окончания работы скрипта всё содержимое этой трубы перемещается в браузер. Однако, иногда необходимо динамически выводить данные в PHP-скрипте, то есть видеть определённый результат прямо в процессе работы.

Давайте для начала разберём такой пример:

<?php
  for ($i = 0; $i < 5; $i++) {
    echo $i;
    sleep(1);
  }
?>

Если запустить данные скрипт, то примерно в течение 5-ти секунд ничего происходить не будет, а затем мгновенно появятся все 5 цифр. Это как раз наглядное доказательство существования выходного потока. Сначала в выходной поток помещаются все данные через echo, а после выполнения скрипта, содержимое выходного потока мгновенно выбрасывается в браузер.

Теперь давайте всё-таки разберём, как динамически выводить данные в PHP-скрипте. Делается это с помощью специальной функции flush(), которая позволяет высвободить выходной поток ещё до завершения скрипта. Перепишем предыдущий пример:

<?php
  for ($i = 0; $i < 5; $i++) {
    echo $i;
    flush();
    sleep(1);
  }
?>

В результате каждую секунду Вы будете видеть появление одной цифры.

Где можно использовать функцию flush()? В основном, это очень долгие скрипты. Допустим, Вы сделали какой-нибудь парсер сайта. Если сайт большой, то парсер будет работать очень долго, и чтобы видеть, что он элементарно не зациклился и вообще ешё работает, можно выводить адрес последней считанной страницы. Это всего лишь как пример, и таких примеров у функции flush() великое множество.