Построение "долгих" отчетов, PHP + jQuery @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 5 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Заголовок сообщения: Построение "долгих" отчетов, PHP + jQuery
Сообщение Добавлено: 3 Декабрь 2011, 08:22:37 
Здравствуйте уважаемые. Имеются несколько трудоемких и долгих задач, а именно - построение отчетов. Выполняться задача может несколько часов. Серверная часть реализована на PHP. Проблема вот в чем - при запуске построения отчета с web-сервера скрипт крутится на сервере и не подает признаков жизни вплоть до окончания выполнения. То есть, пока отчет не построен, узнать, что там да как - нельзя.

Поэтому я разбиваю построение отчета на элементарные операции, т.е. обращаюсь снова и снова к серверному скрипту посредством AJAX-запроса, который возвращает промежуточные результаты, и хочу показывать их клиенту, или посредством progress-бара, или еще как-нибудь, не важно. В связи с чем образуется конструкция:

Код:
function get_dates()
{
   $.post( "/services/journal/reports/ws.php",
      { cmd: 'get_month_dates' },
      function(data) {
         eval(data);
         // по каждой дате
         
         $.each( days, function() {
            
            var rep = $.ajax({
               type: "POST",         
               async: false,
               url: "/services/journal/reports/ws.php",
               data: "cmd=get_day_otiz_report&day=" + this
            }).responseText;
            
            $("#mreport").append('<p>Сформирован отчет: ' + this + '</p>');
         });
         
         prepare();
      }
   );
}


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

Причину выяснить не могу, помогите!

_________________
Лишь одно в моём кармане - беспонтовый пирожок
redreem Муж.
соучастник
0
Сообщения: 329
Зарегистрирован: 08.01.11
Сообщение Добавлено: 3 Декабрь 2011, 12:32:36 
нельзя помочь видя 10% участующего кода. тут можно только посоветовать проверять элементарным alert(123); каждый шаг кода и смотреть где происходит это временное подвисание. что у вас делаеть prepare? может отчет то и присутствует уже в DOM, а дело всеголишь в prepare, которая снимает с элемента "невидимость"? в общем пока больше вопросов чем предположений.
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 5 Декабрь 2011, 05:34:51 
prepare #mreport ничего не пишет, оно заполняет другой слой, когда отчет сформирован.

alert-ом все проверял, в том и дело - если есть alert - появляются данные на экране поэтапно, как положено, нет - появляются только по завершении $.each()…

Чуйство такое, что просто не успевает ничего появляться, подвисает как бы. Пробовал $.each() менять на for(), то же самое.

Я привел достаточно кода. Видно, что запрос синхронный, this в контексте $.each() - дата из массива days, который получаю из $.post и JSON. По каждой дате запускается формирование отчета, результат запроса - записи в БД и строка "сформирован отчет за дату" на выходе, которую я добавляю в DOM для визуализации этапа.

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

На серверной стороне лог ошибок пустой, JS тоже не ругается.

_________________
Лишь одно в моём кармане - беспонтовый пирожок
redreem Муж.
соучастник
0
Сообщения: 329
Зарегистрирован: 08.01.11
Сообщение Добавлено: 5 Декабрь 2011, 07:44:04 
попробуйте заменить
Код:
$("#mreport").append('<p>Сформирован отчет: ' + this + '</p>');
на


Код:
var repEl = document.getElementById('mreport'); // - эту строчку конечно целесообразно вынести за each
repEl.innerHTML = repEl.innerHTML + '<p>Сформирован отчет: ' + this + '</p>';


если не поможет - дайте ссылку на работающую страницу - порой "достаточность кода" вещь индивидуальная :)
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 6 Декабрь 2011, 13:57:40 
Ccылку дать не могу - сайт внутрикорпоративный. В общем, не помогло (( Проверю еще на Opera - все сказанное мною справедливо для IE9 и IE8, на остальных браузерах не проверял, НО:

в подобном случае применял progressBar от jQuery - и о чудо, все работало. Но все же очень хочется выснить причину, что это, торможение JS, или кривые руки?

_________________
Лишь одно в моём кармане - беспонтовый пирожок
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 5 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100