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 :: Отображение прогресса обработки

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
freelsd
Отправлено: 14 Октября, 2015 - 18:15:46
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




У меня есть некий ресурсоемкий процес. Хотелсь бы выводить в браузер его состояние, как на консоли примерно. То есть показал что какой-то процент обработался, стер эту запись, потом показал новый процентаж. Я надеюсь, что ясно выразился. Я так понял что нужно ob_clean() и flush() использовать? Или как лучше этого достичь?
 
 Top
Мелкий Супермодератор
Отправлено: 14 Октября, 2015 - 19:58:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ресурсоёмкий процесс запускаете только в консоли. Если надо его запускать из веба - exec в помощь. Или, как более взрослое и контролируемое решение - сервер очередей.
Этот процесс время от времени пишет в какое-то хранилище отчёт о своём выполнении.

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


-----
PostgreSQL DBA
 
 Top
freelsd
Отправлено: 14 Октября, 2015 - 20:38:40
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




Мелкий пишет:
Ресурсоёмкий процесс запускаете только в консоли. Если надо его запускать из веба - exec в помощь. Или, как более взрослое и контролируемое решение - сервер очередей.
Этот процесс время от времени пишет в какое-то хранилище отчёт о своём выполнении.

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


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

Вот на как на рисунке второй вариант. Так понятнее будет. Мне нагрузка на апач не суть важна, можно и из веба запускать.
Прикреплено изображение (Нажмите для увеличения)
Безымянный.png
 
 Top
Мелкий Супермодератор
Отправлено: 14 Октября, 2015 - 20:43:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Алгоритм тот же.
Вместо красивого прогресс-бара можно делать всё что угодно.


-----
PostgreSQL DBA
 
 Top
freelsd
Отправлено: 14 Октября, 2015 - 20:44:41
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




Мелкий пишет:
Алгоритм тот же.
Вместо красивого прогресс-бара можно делать всё что угодно.

Так я и спрашиваю, как собственно реализовать такой вывод? Чтобы статус не новой строкой дописывался а одной.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Октября, 2015 - 21:33:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Вы мне предлагаете процитировать собственное сообщение?
Как это будет выглядеть на морде зависит только того, что вы сделаете вместо этапа "рисует красивый прогресс-бар"


-----
PostgreSQL DBA
 
 Top
freelsd
Отправлено: 14 Октября, 2015 - 21:36:27
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




Мелкий пишет:
Вы мне предлагаете процитировать собственное сообщение?
Как это будет выглядеть на морде зависит только того, что вы сделаете вместо этапа "рисует красивый прогресс-бар"

Лол, ну так я конкретно и спрашиваю как мне это сделать вместо этапа "рисует красивый прогресс-бар" =)

(Отредактировано автором: 14 Октября, 2015 - 21:37:47)

 
 Top
DelphinPRO
Отправлено: 14 Октября, 2015 - 23:18:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Аяксом раз Х секунд делаете запрос на сервер, который читает отчет их базы, который туда пишет ресурсоемкий процесс. Запрос возвращает процент состояния, вы выводите на страницу это процент.

Как выводить на страницу?
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();


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


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
freelsd
Отправлено: 15 Октября, 2015 - 10:39:47
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




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.

(Отредактировано автором: 15 Октября, 2015 - 12:01:47)

 
 Top
DelphinPRO
Отправлено: 15 Октября, 2015 - 14:05:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




freelsd пишет:
Хотя, наверное, это противоречит приниципу работы браузера и http.

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


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
freelsd
Отправлено: 15 Октября, 2015 - 14:51:28
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




DelphinPRO пишет:
freelsd пишет:
Хотя, наверное, это противоречит приниципу работы браузера и http.

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


Понятно. Кстати, нормальный рабочий пример с аяксом так и не нашел. Остановился пока на текстовом выводе.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB