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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Отображение прогресса обработки
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
У меня есть некий ресурсоемкий процес. Хотелсь бы выводить в браузер его состояние, как на консоли примерно. То есть показал что какой-то процент обработался, стер эту запись, потом показал новый процентаж. Я надеюсь, что ясно выразился. Я так понял что нужно ob_clean() и flush() использовать? Или как лучше этого достичь?
Мелкий
Отправлено: 14 Октября, 2015 - 19:58:21
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Ресурсоёмкий процесс запускаете только в консоли. Если надо его запускать из веба - exec в помощь. Или, как более взрослое и контролируемое решение - сервер очередей.
Этот процесс время от времени пишет в какое-то хранилище отчёт о своём выполнении.
Веб-морда тем временем периодически опрашивает сервер, читает это состояние скрипта и рисует красивый прогресс-бар. Можно каким-нибудь веб-сокетом, если есть желание.
----- PostgreSQL DBA
freelsd
Отправлено: 14 Октября, 2015 - 20:38:40
Гость
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
Мелкий пишет:
Ресурсоёмкий процесс запускаете только в консоли. Если надо его запускать из веба - exec в помощь. Или, как более взрослое и контролируемое решение - сервер очередей.
Этот процесс время от времени пишет в какое-то хранилище отчёт о своём выполнении.
Веб-морда тем временем периодически опрашивает сервер, читает это состояние скрипта и рисует красивый прогресс-бар. Можно каким-нибудь веб-сокетом, если есть желание.
А если без красивого прогресс бара, текстом просто выводить в цикле какую-то информацию. Просто хотелось бы чтобы вывод не шел браузер каждый раз новой строкой, а чтобы все было одной записью.
Вот на как на рисунке второй вариант. Так понятнее будет. Мне нагрузка на апач не суть важна, можно и из веба запускать. Прикреплено изображение (Нажмите для увеличения)
Мелкий
Отправлено: 14 Октября, 2015 - 20:43:20
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Алгоритм тот же.
Вместо красивого прогресс-бара можно делать всё что угодно.
----- PostgreSQL DBA
freelsd
Отправлено: 14 Октября, 2015 - 20:44:41
Гость
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
Мелкий пишет:
Алгоритм тот же.
Вместо красивого прогресс-бара можно делать всё что угодно.
Так я и спрашиваю, как собственно реализовать такой вывод? Чтобы статус не новой строкой дописывался а одной.
Мелкий
Отправлено: 14 Октября, 2015 - 21:33:48
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Вы мне предлагаете процитировать собственное сообщение?
Как это будет выглядеть на морде зависит только того, что вы сделаете вместо этапа "рисует красивый прогресс-бар"
----- PostgreSQL DBA
freelsd
Отправлено: 14 Октября, 2015 - 21:36:27
Гость
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
Мелкий пишет:
Вы мне предлагаете процитировать собственное сообщение?
Как это будет выглядеть на морде зависит только того, что вы сделаете вместо этапа "рисует красивый прогресс-бар"
Лол, ну так я конкретно и спрашиваю как мне это сделать вместо этапа "рисует красивый прогресс-бар" =)
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Аяксом раз Х секунд делаете запрос на сервер, который читает отчет их базы, который туда пишет ресурсоемкий процесс. Запрос возвращает процент состояния, вы выводите на страницу это процент.
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
DelphinPRO пишет:
Аяксом раз Х секунд делаете запрос на сервер, который читает отчет их базы, который туда пишет ресурсоемкий процесс. Запрос возвращает процент состояния, вы выводите на страницу это процент.
Спасибо за подробный ответ. Странно, но у меня не работает. Поместил код на страницу, но информация не обновилась. Я так понимаю что это нужно оформить в функцию и пускать в цикле с setTimeout? Еще, видимо, тут закралась ошибка, вместо responce должно быть r.responseText. Но почему-то элемент все-равно не обновляется. Странно. (Добавление)
Вот, кстати в продолжении темы, что я имел в виду:
Но скрипт выводит подряд 10 20 30 и тд. А мне нужно чтобы сначала одно число появлялось, затем другое. Хотя, наверное, это противоречит приниципу работы браузера и http.
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
freelsd пишет:
Хотя, наверное, это противоречит приниципу работы браузера и http.
Да.
Вам же сказали - ресурсоемкий процесс запускается отдельно. Он работает сам по себе и время от времени пишет в базу (например) процент своего выполнения.
Ваша страница читает аяксом эти данные, и показывает пользователю.
>> Я так понимаю что это нужно оформить в функцию и пускать в цикле с setTimeout?
Разумеется, нужно периодически опрашивать сервер. Запрос каждую секунду\минуту\час - самый простой вариант. Альтернатива - long polling, websockets
----- Чем больше узнаю, тем больше я не знаю.
freelsd
Отправлено: 15 Октября, 2015 - 14:51:28
Гость
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
DelphinPRO пишет:
freelsd пишет:
Хотя, наверное, это противоречит приниципу работы браузера и http.
Да.
Вам же сказали - ресурсоемкий процесс запускается отдельно. Он работает сам по себе и время от времени пишет в базу (например) процент своего выполнения.
Ваша страница читает аяксом эти данные, и показывает пользователю.
>> Я так понимаю что это нужно оформить в функцию и пускать в цикле с setTimeout?
Разумеется, нужно периодически опрашивать сервер. Запрос каждую секунду\минуту\час - самый простой вариант. Альтернатива - long polling, websockets
Понятно. Кстати, нормальный рабочий пример с аяксом так и не нашел. Остановился пока на текстовом выводе.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.