Итак, я работаю над индикатором выполнения сценария обработки CSV. dnc_scrubber.php
проходит через CSV и проверяет номер телефона на базе базы данных, возвращая сопоставленные и несогласованные данные в отдельных файлах. lines.php
возвращает общее количество строк для обработки, в то время как progress.php
возвращает количество строк. Я использую эти два числа, чтобы создать процент работы, выполненной для функции progressbar jQuery.
Моя проблема в том, что первый .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']
на один в конце процесса проверки для каждой строки
Скорее всего, ваш сервер ограничивает количество одновременных подключений для каждого пользователя до 1. Или вы используете сеансы, а первый скрипт заблокирован. Второй скрипт будет заблокирован до тех пор, пока первый из них не заблокирует файл сеанса. Используйте только session_start()
если вам нужно, и отпустите блокировку с помощью session_write_close()
как только вы закончите с ней.
Изменить: я не уверен, что это сработает, но вы можете попробовать. Каждый раз, когда вы хотите обновить сеанс, вызовите session_start()
, обновите сеанс, затем вызовите session_write_close()
. Я не уверен, если вам разрешено делать это несколько раз в скрипте, но похоже, что он должен работать.
Не уверен, что это точная причина вашей проблемы, но это то, что нужно исправлять.
+ Изменить
setTimeout(doProgressBar(), 100);
к
setTimeout(doProgressBar, 100);
Вы вызываете doProgressBar сразу, а не после завершения таймаута.
Ajax будет assync.
lines.php
, вероятно, ждет на dnc_scrubber.php
поскольку первый заблокировал MySQL.
Это просто угадывание, поскольку у нас нет вашего PHP-кода, но попробуйте запустить оба скрипта PHP вручную и проверить, не lines.php
ли lines.php
что MySQL закончит.
при чтении вашего CSV-файла с помощью кода PHP он блокирует файл? поэтому, если он должен прочитать его дважды, он будет читать его только тогда, когда предыдущий код закрывает поток?
что произойдет, если вы откроете 2 браузера и запустите код одновременно? выполняются ли оба браузера одновременно с теми же результатами? или есть ожидание в файле?