PHP – отображение состояния цикла

У меня есть PHP-скрипт:

$i=0; for(;$i<500;++i) { //Do some operation with files numbered 0 to 500; } 

Дело в том, что скрипт работает и отображает конечные результаты, но операция занимает некоторое время, и просмотр пустого экрана может расстраивать. Я думал, если есть способ, я могу постоянно обновлять страницу с конца клиента, детализируя, какой файл в настоящее время обрабатывается. То есть, могу ли я отображать и постоянно обновлять текущее значение $ i ?

Решение

Всем спасибо! Буферизация вывода работает как предложено. Тем не менее, Дэвид предложил ценную информацию, и я также рассматриваю этот подход.

Вы можете буферизировать и контролировать вывод из PHP-скрипта.

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

  1. Пользователь запускает процесс. Это может быть так же просто, как установить флаг в записи в базе данных или вставить в данные некоторые «обрабатываемые» записи.
  2. Пользователь сразу же направляется на страницу, указывающую, что процесс был поставлен в очередь.
  3. В автономном режиме (который запускается скриптом PHP на сервере или планируется регулярное выполнение) проверяет данные и выполняет тяжелую обработку.
  4. Тем временем пользователь может обновить страницу (вручную, путем навигации в другом месте и возврата к проверке или даже использовать механизм опроса AJAX для обновления страницы), чтобы проверить состояние обработки. В этом случае, похоже, у вас будет несколько сотен записей в таблице базы данных, поставленных в очередь для обработки. По мере того, как каждый заканчивается, он может быть отмечен как выполненный. На странице можно просто проверить, сколько осталось, какая из них и т. Д. Из данных.
  5. Когда обработка завершена, на странице отображается результат.

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

Проверьте выходную буферизацию PHP .

Попробуй использовать:

 flush(); 

http://php.net/manual/ru/function.flush.php

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

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

Кроме того, сами браузеры вводят буфер, поэтому у вас могут возникнуть проблемы. Например, некоторые версии IE не будут отображать страницу до 256 байт.