PHP - Показать статус цикла - PullRequest
1 голос
/ 18 мая 2011

У меня есть сценарий PHP что-то вроде:

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

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

Решение

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

Ответы [ 4 ]

3 голосов
/ 18 мая 2011

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

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

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

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

1 голос
/ 18 мая 2011
0 голосов
/ 18 мая 2011

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

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

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

0 голосов
/ 18 мая 2011

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

flush();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...