Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Отображение прогресса обработки
Форумы портала PHP.SU » » Вопросы новичков » Отображение прогресса обработки

Страниц (1): [1]
 

1. freelsd - 14 Октября, 2015 - 18:15:46 - перейти к сообщению
У меня есть некий ресурсоемкий процес. Хотелсь бы выводить в браузер его состояние, как на консоли примерно. То есть показал что какой-то процент обработался, стер эту запись, потом показал новый процентаж. Я надеюсь, что ясно выразился. Я так понял что нужно ob_clean() и flush() использовать? Или как лучше этого достичь?
2. Мелкий - 14 Октября, 2015 - 19:58:21 - перейти к сообщению
Ресурсоёмкий процесс запускаете только в консоли. Если надо его запускать из веба - exec в помощь. Или, как более взрослое и контролируемое решение - сервер очередей.
Этот процесс время от времени пишет в какое-то хранилище отчёт о своём выполнении.

Веб-морда тем временем периодически опрашивает сервер, читает это состояние скрипта и рисует красивый прогресс-бар. Можно каким-нибудь веб-сокетом, если есть желание.
3. freelsd - 14 Октября, 2015 - 20:38:40 - перейти к сообщению
Мелкий пишет:
Ресурсоёмкий процесс запускаете только в консоли. Если надо его запускать из веба - exec в помощь. Или, как более взрослое и контролируемое решение - сервер очередей.
Этот процесс время от времени пишет в какое-то хранилище отчёт о своём выполнении.

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


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

Вот на как на рисунке второй вариант. Так понятнее будет. Мне нагрузка на апач не суть важна, можно и из веба запускать.
4. Мелкий - 14 Октября, 2015 - 20:43:20 - перейти к сообщению
Алгоритм тот же.
Вместо красивого прогресс-бара можно делать всё что угодно.
5. freelsd - 14 Октября, 2015 - 20:44:41 - перейти к сообщению
Мелкий пишет:
Алгоритм тот же.
Вместо красивого прогресс-бара можно делать всё что угодно.

Так я и спрашиваю, как собственно реализовать такой вывод? Чтобы статус не новой строкой дописывался а одной.
6. Мелкий - 14 Октября, 2015 - 21:33:48 - перейти к сообщению
Вы мне предлагаете процитировать собственное сообщение?
Как это будет выглядеть на морде зависит только того, что вы сделаете вместо этапа "рисует красивый прогресс-бар"
7. freelsd - 14 Октября, 2015 - 21:36:27 - перейти к сообщению
Мелкий пишет:
Вы мне предлагаете процитировать собственное сообщение?
Как это будет выглядеть на морде зависит только того, что вы сделаете вместо этапа "рисует красивый прогресс-бар"

Лол, ну так я конкретно и спрашиваю как мне это сделать вместо этапа "рисует красивый прогресс-бар" =)
8. DelphinPRO - 14 Октября, 2015 - 23:18:55 - перейти к сообщению
Аяксом раз Х секунд делаете запрос на сервер, который читает отчет их базы, который туда пишет ресурсоемкий процесс. Запрос возвращает процент состояния, вы выводите на страницу это процент.

Как выводить на страницу?
CODE (javascript):
скопировать код в буфер обмена
  1. document.getElementById('percent').innerHTML(percent)

Как сделать аякс-запрос?
CODE (javascript):
скопировать код в буфер обмена
  1. var r = new XMLHttpRequest();
  2. r.open("POST", "path/to/api", true);
  3. r.onreadystatechange = function () {
  4.   if (r.readyState != 4 || r.status != 200) return;
  5.   document.getElementById('percent').innerHTML(responce);
  6. };
  7. r.send();


Что еще разжевать? Улыбка
9. freelsd - 15 Октября, 2015 - 10:39:47 - перейти к сообщению
DelphinPRO пишет:
Аяксом раз Х секунд делаете запрос на сервер, который читает отчет их базы, который туда пишет ресурсоемкий процесс. Запрос возвращает процент состояния, вы выводите на страницу это процент.

Как выводить на страницу?
CODE (javascript):
скопировать код в буфер обмена
  1. document.getElementById('percent').innerHTML(percent)

Как сделать аякс-запрос?
CODE (javascript):
скопировать код в буфер обмена
  1. var r = new XMLHttpRequest();
  2. r.open("POST", "path/to/api", true);
  3. r.onreadystatechange = function () {
  4.   if (r.readyState != 4 || r.status != 200) return;
  5.   document.getElementById('percent').innerHTML(responce);
  6. };
  7. r.send();


Что еще разжевать? Улыбка


Спасибо за подробный ответ. Странно, но у меня не работает. Поместил код на страницу, но информация не обновилась. Я так понимаю что это нужно оформить в функцию и пускать в цикле с setTimeout? Еще, видимо, тут закралась ошибка, вместо responce должно быть r.responseText. Но почему-то элемент все-равно не обновляется. Странно.
(Добавление)
Вот, кстати в продолжении темы, что я имел в виду:

PHP:
скопировать код в буфер обмена
  1. $progress = 0;
  2. error_reporting(E_ERROR);
  3. while($progress <= 100)
  4. {
  5.         echo str_pad('',4096);
  6.     ob_end_flush();
  7.         ob_flush();
  8.     flush();
  9.     ob_start();
  10.         echo $progress;
  11.        
  12.         $progress += 10;
  13.         sleep(1);
  14.  
  15. }


Но скрипт выводит подряд 10 20 30 и тд. А мне нужно чтобы сначала одно число появлялось, затем другое. Хотя, наверное, это противоречит приниципу работы браузера и http.
10. DelphinPRO - 15 Октября, 2015 - 14:05:33 - перейти к сообщению
freelsd пишет:
Хотя, наверное, это противоречит приниципу работы браузера и http.

Да.
Вам же сказали - ресурсоемкий процесс запускается отдельно. Он работает сам по себе и время от времени пишет в базу (например) процент своего выполнения.
Ваша страница читает аяксом эти данные, и показывает пользователю.
>> Я так понимаю что это нужно оформить в функцию и пускать в цикле с setTimeout?
Разумеется, нужно периодически опрашивать сервер. Запрос каждую секунду\минуту\час - самый простой вариант. Альтернатива - long polling, websockets
11. freelsd - 15 Октября, 2015 - 14:51:28 - перейти к сообщению
DelphinPRO пишет:
freelsd пишет:
Хотя, наверное, это противоречит приниципу работы браузера и http.

Да.
Вам же сказали - ресурсоемкий процесс запускается отдельно. Он работает сам по себе и время от времени пишет в базу (например) процент своего выполнения.
Ваша страница читает аяксом эти данные, и показывает пользователю.
>> Я так понимаю что это нужно оформить в функцию и пускать в цикле с setTimeout?
Разумеется, нужно периодически опрашивать сервер. Запрос каждую секунду\минуту\час - самый простой вариант. Альтернатива - long polling, websockets


Понятно. Кстати, нормальный рабочий пример с аяксом так и не нашел. Остановился пока на текстовом выводе.

 

Powered by ExBB FM 1.0 RC1