2012-01-18 40 views
1

Итак, я работаю над индикатором выполнения сценария обработки CSV. dnc_scrubber.php проходит через CSV и проверяет номер телефона на базу данных, возвращая сопоставленные и несогласованные данные в отдельных файлах. lines.php возвращает общее количество обрабатываемых строк, в то время как progress.php возвращает количество строк, которые были обработаны. Я использую эти два числа, чтобы создать процент работы, выполненной для функции progressbar jQuery.. Ямайка() вызов не будет завершен до предыдущего .ajax() звонок завершен?

Моя проблема заключается в том, что первый звонок .ajax() в пределах doProgressBar() не заканчивается, пока не закончится звонок dnc_scrubber.php. Чтобы уточнить, при просмотре сетевого монитора в Chrome запрос делается на lines.php одновременно с запросом на dnc_scrubber.php, но ответ не получен, пока dnc_scrubber.php не закончил работу. Вот соответствующий код:

$('#progressbar').progressbar();    


$.ajax({ 
url: 'dnc_scrubber.php', 
type: 'POST', 
async: true, 
data: querystring, 
success: function(){ 
    for (i = 0; i < files.length; i++){ 
     $('#complete').append('<a href="process/MATCHED - ' + files[i] + '">MATCHED - ' + files[i] + '</a><br />'); 
     $('#complete').append('<a href="process/SCRUBBED - ' + files[i] + '">SCRUBBED - ' + files[i] + '</a><br />'); 
    } 
}      
}); 


function doProgressBar(){     
$.ajax({ 
    url: 'lines.php', 
    async: true, 
    dataType: 'json', 
    complete: function (rez) { 
     lines = JSON.parse(rez.responseText); 
     lines = parseInt(lines.lines); 

     console.log('dpg1 - lines: ' + lines); 

     $.ajax({ 
      url: 'progress.php', 
      async: true, 
      dataType: 'json', 
      complete: function (rez1) { 
       prog = JSON.parse(rez1.responseText); 
       prog = parseInt(prog.progress); 

       console.log('dpg2 - lines: ' + lines + ' prog: ' + prog); 

       if (lines > prog){ 
        var bar = (prog/lines) * 100;           
        var bar = Math.round(bar);           
        $('#progressbar').progressbar('option', 'value', bar); 
        setTimeout(doProgressBar(), 1000); 
        console.log('dpg3 - lines: ' + lines + ' prog: ' + prog + ' bar: ' + bar); 
       } else if (lines == prog){ 
        $('#progressbar').progressbar('option', 'value', 100); 
        console.log('dpg3 - lines == prog'); 
       } 

      } 
     }); 

    } 
}); 
} 



setTimeout(doProgressBar(), 100); 

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

EDIT: lines.php

session_start(); 
header('Content-type: application/json'); 
echo json_encode(array('lines' => $_SESSION['lines'])); 

progress.php

session_start(); 
header('Content-type: application/json'); 
echo json_encode(array('progress' => $_SESSION['lines_processed'])); 

увеличивает процессор CSV в $_SESSION['lines_proccessed'] по одному в конце процесс проверки для каждой строки

+0

Сколько соединений является сервером, разрешающим в любой момент времени? – nobody

+0

@nobody сервер разрешает очень большое количество соединений в соответствии с моими ИТ-ребятами. Это встроенный сервер разработки Ubuntu, работающий с лампой - с основными значениями по умолчанию. – jebriggsy

ответ

2

Скорее всего, ваш сервер ограничивает количество одновременных подключений для каждого пользователя до 1. Или вы используете сеансы, а первый скрипт заблокирован. Второй скрипт будет заблокирован до тех пор, пока первый из них не заблокирует файл сеанса. Используйте только session_start(), если вам нужно, и отпустите замок с session_write_close(), как только вы закончите с ним.

Редактировать: Я не уверен, что это сработает, но вы можете попробовать. Каждый раз, когда вы хотите обновить сеанс, вызовите session_start(), обновите сеанс, затем вызовите session_write_close(). Я не уверен, если вам разрешено делать это несколько раз в скрипте, но похоже, что он должен работать.

+0

хороший. Если бы не об этом, но это еще более правдоподобно, чем мой ответ. Собираюсь оставить меня на всякий случай ... но здесь большие пальцы. – Frankie

+0

@Frankie - Смешно, я тоже думал о * твоем * ответе. Трудно сказать, что это, не видя php-код. – gilly3

+0

Я использую сеансы. Я использую 'session_start()' для всех задействованных файлов. 'dnc_scrubber.php' устанавливает' $ _SESSION ['lines'] ', который читается' lines.php'. Он также обновляет '$ _SESSION ['lines_processed']', поскольку он проходит через строки CSV. 'progress.php' возвращает эту переменную сеанса. Возможно, это источник моей проблемы. Есть ли у вас какие-либо предложения относительно лучшего способа отслеживания прогресса? – jebriggsy

2

Не уверен, что это точная причина вашей проблемы, но это некоторая который требует исправления.

Изменить

setTimeout(doProgressBar(), 100); 

Для

setTimeout(doProgressBar, 100); 

Вы сразу вызова doProgressBar, а не после того, как тайм-аут завершен.

+0

Спасибо, я сделаю это изменение – jebriggsy

1

Ajax будет assync.

lines.php, вероятно, ждет на dnc_scrubber.php, поскольку первый заблокировал MySQL.

Это просто угадывание, поскольку у нас нет вашего PHP-кода, но попробуйте запустить оба скрипта PHP вручную и проверьте, нене дождался завершения MySQL.

+0

'lines.php' просто возвращает переменную сеанса как JSON – jebriggsy

+0

@ Obi-wan Jacobi затем проверяет gilly3 ответ. Собираюсь оставить меня на всякий случай у кого-то из Google, и у меня другая проблема, но я думаю, что он прибил ее. – Frankie

0

при чтении вашего CSV-файла с помощью PHP-кода блокировка файла?поэтому, если он должен прочитать его дважды, он будет читать его только тогда, когда предыдущий код закрывает поток?

Что произойдет, если вы откроете 2 браузера и запустите код в одно и то же время? выполняются ли оба браузера одновременно с теми же результатами? или есть ожидание в файле?