Вывод статистики о ходе выполнения долгих операций

Вы делаете сервис (скрипт), который будет выполнять достаточно долго? Тогда, вам точно стоит подумать о выводе статистики по ходу выполнения операции.
Задача
Есть примерно такая таблица.

В которой перечислено огромное количество RSS лент содержимое, которых мы хотим получить. Но, на этом наши хотелки не заканчиваются. Мы хотим, не дожидаясь полной обработки всех лент видеть результат по уже обработанным лентам, а именно: количество записей в ленте и статус — обработана/не обработана.
Как решить
  • Можно отправлять на обработку маленькими порциями. Т.е. ставим интервал и каждые 1сек. отправляем по 5 лент.
  • Отправляем сразу все ленты, а по ходу обработки скидываем статистику во временный файл. Дальше по интервалу считываем временный файл и выводим результаты в таблицу.
Допустим, нам приглянулся второй вариант — его и будем делать.

Решение
У нас в распоряжение есть php и js(jqurey). Приступим!
JS выдран из моего скрипта. Если, захотите воспользоваться им, то допишите метод для вывода результатов на страницу.

var rss = 
{
  /**
   * ID запроса. Будет использоватся как имя файла со статистикой 
   * по ходу выполнения обработки. 
   */
  idQuery: '',
  /**
   * Ограничивает одновременное число запросов
   */
  numQuery: 0,
  /**
   * Если надо остановить проверку, то true
   */
  stop: false,
    
  /**
   * Отправляем RSS лент для обработки.
   */
  run: function() 
  {
    var req = '.......'; // Здесь мы формируем строку запроса из выбраных для обработки лент
    
    req += '&query_id='+this.genIdQuery(); // Генерируем id запроса 
    var ajaxOpts = { 
      type: 'post', 
      url: 'index.php',
      dataType: 'json',
      data: req,
      beforeSend: function () {
        rss.getStat();
      },
      success: function(data) {
        rss.viewResult(data);
      },
      complete: function () {
        rss.stop = true;
        rss.numQuery = 0;
      }
    }; 
      
    $.ajax(ajaxOpts);
  },
    
  genIdQuery: function()
  {
    return this.idQuery = new Date().getTime();
  },
    
  /**
   * Получаем по интервалу статистику с ходом выполнения.
   * Для этого считываем файл со статистикой.   
   */
  getStat: function()
  {
    // Ставим итревал.
    var id = setInterval(function() {
      // Проверяем не остановлена ли проверка и 
      // не выполняется ли уже запрос на получение статистики. 
      if (rss.stop != true && rss.numQuery < 2) { 
        var ajaxOpts = { 
          type: 'get', 
          cache: false,
          url: 'tmp/'+rss.idQuery+'.json',
          dataType: 'json',
          beforeSend: function () {
            rss.numQuery++;
          },
          success: function(data) {
            rss.viewResult(data);
          },
          complete: function () {
            rss.numQuery--;
          }
        }; 
          
        $.ajax(ajaxOpts);
      }else if (stop != true && graber.numQuery > 2) {
        return false;
      }else {
        clearInterval(id);
        rss.stop = false;
        return false;
      }
    }, 1000);
  },
    
  /**
   * Выводим результат в соответствующие поля таблицы.
   */
  viewResult: function(data) {
    // ......................  
  }
}; 
 
 
$('button').cllck(function(e) {
  e.preventDefault();
  rss.run();
});


Собственно на этом все. Теперь во время выполнения долгих операций, можно будет посмотреть сколько еще осталось ждать, да и вообще вести любую статистику.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.