|
ajax php и bootstrap
Здравствуйте!
В общем у меня уже недели две как кризис не могу идти дальше :cray: А дело вот в чём. Раньше-то я работал с ajax и всё нормально было. Теперь потребовалась обработка большого числа строк для сайта заказчика. Ну понятное дело обработчик в php файле и всё работает. Но, поскольку строк достаточно много, обязательно требуется прогрессбар... и вот тут начинается самое интересное. У меня не получается его организовать даже с банальным циклом for и sleep... Ну я понимаю, что делаю лишь бы что.... покажу. Таймер прикручивал, пробовал через кукисы... толку нет. Мне бы понять механизм, как таймер из скрипта срабатывает.... В интернете полно уроков по загрузке файла, а по работе со строками нет :( $(document).ready(function(){ $('#start-data').submit(function(event){ event.preventDefault(); var form = $(this); var data = form.serialize(); $("#start-data").hide(); $("#progress").show(); $.ajax({ type: "POST", dataType: "text", url: 'functions.php', async: true, data: data, success:function(html) { if (Cookies.get('errorflag')==1) { console.log('bad'); } else { console.log('good'); } }, error: function (jqXHR, exception) { var msg = ''; if (jqXHR.status === 0) { msg = 'Нет соединения.\n Проверьте подключение к Интернету.'; } else if (jqXHR.status == 404) { msg = 'Искомая страница не найдена. [404]'; } else if (jqXHR.status == 500) { msg = 'Internal Server Error [500].'; } else if (exception === 'parsererror') { msg = 'Запрос JSON не найден.'; } else if (exception === 'timeout') { msg = 'Истекло время ожидания скрипта!'; } else if (exception === 'abort') { msg = 'Ajax запрос прерван.'; } else { msg = 'Неизвестный тип ошибки!.\n' + jqXHR.responseText; } msg = msg+"\n<strong>Если не можете сами исправить пишите мне!</strong>" $('#error').show(); $('#error').append(msg); } }); setTimeout(function run() { var timer = Cookies.get('Timer'); if (timer < 99){ if ($("#progress div").css("width") != timer) $("#progress div").css("width", timer+"%"); setTimeout(run, 1000); } else { $("#progress").hide(); $("#result").show(); } }, 1000); }); }); И functions.php $progress = 0; for($i=0;$i<100;$i++){ sleep(2); $progress = $i; } echo $progress; Хотя бы подскажите что читать... Спасибо! |
Цитата:
|
Цитата:
$progress = 0; for($i=0;$i<100;$i++){ sleep(2); $progress = $i; } $result = 'some result'; echo $result; Может таймер я поставил не туда, может результат $progress нужно в json поставить, потому что я ставил в куки - не работает... в общем, ткните меня носом, где я не так мыслю... спасибо! |
То есть, ради развлечь пользователя искусственно создаем еще и дополнительную задержку на сервере помимо естественного времени на работу скрипта? Обычно в таких случаях оптимизируют работу сервера с единственной целью - уменьшить время отклика, а у вас все наоборот. Если РНР версии 5.5 то OPCache в помощь.
Показывают GIF, а если считать в процентах время выполнения, то клиент должен это делать. |
usesa, прогресс-то в браузере надо показывать, а все твои эхи идут в буфер, который пойдет с заголовками в браузер, когда php закроется. Тебе придется на каждую строку или пачку строк поднимать php, получать ответ, рендерить в браузере, снова запрашивать итд.
|
Цитата:
А ты сделай режим idle для прогресс-бара. Когда данные уходят, чтобы жоператор не скучал, ты гоняй прогресс туда-сюда, типо все под контролем, процесс идет. Лол. |
Цитата:
|
warren buffet, процесс работы php скрипта от мгновенного, до 15-20 секунд в зависимости от объёма и параметров фильтрации. Я просто не понимаю может, получается, если я делаю асинхронный ajax запрос, таймеры js на странице чтоли всё равно останавливаются? А если нет - откуда я могу считывать прогресс выполнения скрипта. Из куки я уже понял что не могу, может из файла в который сохранять прогресс или ещё как? я просто хочу понять, как делать грамотно. Я видел такие прогрессбары минимум на трёх сайтах, поэтому не вижу ничего необычного в такой просьбе заказчика.
|
Еще раз
Цитата:
Загрузкой занимается браузер с сервером и это происходит до запуска php скрипта. Скрипт на сервере запускается когда файл уже загружен. Ответ php скрипта реализуется в фазе закрытия php как программы. Поэтому ты не можешь отображать в браузере процессы в php скриптах. Браузер -> сервер -> php -> вывод из буфера -> сервер -> браузер. Прогресс загрузки файла на сервер возможен благодаря взаимодействию браузера и сервера. Браузер посылает кусок байтов, сервер подтверждает - получен кусок, давай другой. До php в этой фазе еще ничего не доходит. Ясно? Чтобы показать прогресс ОБРАБОТКИ данных, придется посылать эти данные кусками и на каждый кусок повторять цепочку Браузер -> сервер -> php -> вывод из буфера -> сервер -> браузер. то есть каждый раз поднимать php (это же всего лишь серверная программа). Таймеры не нужны. Просто берешь данные из файла, читаешь весь файл в массив, или читаешь по строкам, посылаешь на сервер аяксом, получаешь ответ, по факту получения ответа двигаешь прогресс, посылаешь следующую строку или пачку строк и так пока все строки не кончатся. |
Надо бы почитать как уходят из php заголовки. Если немедленно, то можно сэкономить на запусках php, то есть сделать все в рамках одной сессии, однако схема при этом не изменится. Тебе все равно придется посылать строки или пачки строк, получать тем же аяксом заголовки, посылать следующую строку или пачку и двигать прогресс.
Взаимодействие в направлении сервер -> браузер реализуется в тн push технологиях, о которых я ничего не знаю и узнавать не собираюсь. |
Часовой пояс GMT +3, время: 17:19. |
|