Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И опять реализация прогресс-бара... не полоской, а текстом 
V
    Опции темы
stalker2000
Дата 31.7.2014, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.7.2010

Репутация: нет
Всего: нет



Добрый день. 
Пишу некий скрипт (пхп), обрабатывающий поисковые запросы. Юзер скармливает в форму несколько сотен таких запросов и потом грустно смотрит на пустой экран браузера в ожидании результата....

Стоит задача облегчить ему жизнь путём вывода строки "обработано n из m". Делать это, видимо, лучше с помощью ajax и jquery. Сразу после  <body> я добавил блок <div id="progress-label">Обработка...</div>, в который через нехитрую функцию
Код

<script type="text/javascript">
var interval = setInterval(function() {
  $.get('show_progress.php', function(data) {
    $('#progress-label').html(data);
  });
}, 500);
</script>

каждые полсекунды скрипт show_progress.php пишет искомый прогресс. Функция работает, но содержимое блока не обновляется, пока главный скрипт полностью не отработает. Только после этого в блоке прогресса я вижу "Обработано 100 из 100", а в процессе работы там написано "Обработка...".

Подскажите, можно ли сделать динамическое обновление содержимого прогресс-блока до окончания загрузки страницы? Может быть надо сделать вообще как-то иначе?
PM MAIL   Вверх
Aliance
Дата 31.7.2014, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Запросы бывают синхронными, и асинхронными. Что вы вкладываете в понятие "главный скрипт"? И почему его нет в вашем комментарии?
И еще я надеюсь вы же не забыли про очистку интервала, когда n станет равным m?
PM MAIL WWW ICQ Skype   Вверх
stalker2000
Дата 31.7.2014, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.7.2010

Репутация: нет
Всего: нет



Цитата(Aliance @  31.7.2014,  13:38 Найти цитируемый пост)
Что вы вкладываете в понятие "главный скрипт"? И почему его нет в вашем комментарии?

Главный скрипт переваривает данные, которые получил от пользователя. Его нет, потому что он большой. Результирующий код выглядит примерно так:
Код

<html>
<head></head>
<body>

<!-- блок отображения прогресса -->
 <div id="progress-label">Обработка...</div>

<script type="text/javascript">
var interval = setInterval(function() {
  $.get('show_progress.php', function(data) {
    $('#progress-label').html(data);
  });
}, 500);
</script>

<!-- таблица результатов -->
<table>
<tr><td>результат1</td></tr>
<tr><td>результат2</td></tr>
...
<tr><td>результат100</td></tr>
</table>

</body>
</html>

По мере обработки скрипт дописывает в таблицу строки с результатами. Как я писал, на это уходит много времени. Т.е. страница получается недосформированной до самого конца работы скрипта.

Цитата(Aliance @  31.7.2014,  13:38 Найти цитируемый пост)
И еще я надеюсь вы же не забыли про очистку интервала, когда n станет равным m?

Нет, интервал всё время обнуляется, тут всё в порядке.

Это сообщение отредактировал(а) stalker2000 - 31.7.2014, 14:35
PM MAIL   Вверх
Aliance
Дата 1.8.2014, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



А что содержится в show_progress.php? То есть каким образом там идет подсчет значений интервала?
PM MAIL WWW ICQ Skype   Вверх
stalker2000
Дата 1.8.2014, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.7.2010

Репутация: нет
Всего: нет



Цитата(Aliance @ 1.8.2014,  08:16)
А что содержится в show_progress.php? То есть каким образом там идет подсчет значений интервала?

Подсчёт можно сделать любым удобным образом. Я сделал так: основной скрипт пишет в базу кол-во обработанных запросов и общее кол-во, скрипт show_progress.php при запуске просто показывает эти два числа.

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

Кроме того, пришел к выводу что задача изначально была поставлена неверно. Бегло посмотрев html-код загрузки gmail, я решил что либо после прогрессбара происходит редирект на следующую страницу, либо в какой-то блок происходит вывод уже готового содержимого. Но это никак не делается именно в процессе загрузки страницы... Именно отсюда и нужно было плясать...
PM MAIL   Вверх
ksnk
Дата 3.8.2014, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



stalker2000, А какие проблемы то? Технология проста и называется ajax.
Основной скрипт пишет в таблицу свой прогресс. Основной скрипт запускается неведомым нам образом, но это и не особенно важно. show_projress. обязан вывести состояние этого самого основного скрипта. 

show_progress.json.php - имя изменено, для пущего визуального эффекта.
Код

<?php
     header('Content-type: application/json');
     ob_start();
     $result=array('report'=>'just sleeping, nothing to do', 'error'=>0, 'status' =>0);
...// тут мы инициализируем подключение к базе
 // для определенности. Возвращаем массив [progress:xx,max:yy,status:0-nothing; 1 - running;..., data:`status line`]
     $data= DATABASE::selectRow("select * from _statuses where name='download'");

      if($data['status']==1){
         $result['report']=$data['data'];
         $result['status']=$data['status'];
         $result['current']=$data['progress'];
         $result['max']=$data['max'];
      }

      if(!is_array($result)) $result=array($result);
      $result['debug']=array(ob_get_contents());
      ob_end_clean();
      echo json_encode($result);
 


Скрипт в главном скрипте выглядит примерно так...

Код

...
<script type="text/javascript">
var interval = setInterval(function() {
  $.post('show_progress.json.php', function(data) {
     if(data.status){
         $('#progress-label .status').html(data.report);
         $('#progress-label .progress').html(data.progress+'/'+data.max);
         $('#progress-label').show();
    } else {
         $('#progress-label').hide();
    }
  },'json');
}, 500);
</script>
...


Ну и хитрость. Основной скрипт, который выполняет работы, обязан освободить сессию. session_write_close(); перед основным циклом Без этого файл с сессией будет заблокирован и все запросы в ту же сессию будут висеть до скончания работы.

Это сообщение отредактировал(а) ksnk - 4.8.2014, 17:05


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
stalker2000
Дата 5.8.2014, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.7.2010

Репутация: нет
Всего: нет



Цитата(ksnk @  3.8.2014,  14:17 Найти цитируемый пост)
А какие проблемы то? Технология проста и называется ajax.

Это понятно, и проблем нет. Просто надо было изначально делать под отображение прогрессбара. Я поленился переписывать  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.