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 технологиях, о которых я ничего не знаю и узнавать не собираюсь. |
У меня так сделан на одном сайта мастер пакетного внесения товаров в бд. То есть простенькая datagrid заполняется первоначально списком имен файлов выбранных юзером. Затем он работает с этим списком профтыкая в поля и строки всякие товарные параметры и когда все красиво сделает - жмет кнопку. Яваскрипт собирает строку из таблицы в поля new FormData и грузит ее на сервер, по ответу сервера все повторяется, пока таблица не кончится. То есть сама таблица является очередью загрузки. Прогресс-бара нет, просто строка находящаяся в обработке становится желтой, а после обработки - зеленой. Если сервер вернул ошибку - красной. Сидишь и смотришь как таблица весело разукрашивается сверху вниз. Все просто.
|
warren buffet,
опять ахинею несешь. Во-первых РНР может отслеживать процесс загрузки файлов. То, что ты наговорил о загрузке просто бред. Во-вторых в данном случае речь идет не о файле Цитата:
|
А без "мастера" пакетная загрузка делается так. Оператор собирает файлы и csv файл в зип, загружает зип и прогресс-бар показывает загрузку зипа. А после загрузки ему уже нечего показывать - взаимодействия-то нету, и тогда я удаляю атрибут value и прогресс переходит в режим ниче-не-понятно и бегает туда-сюда, а внизу написано "Загрузка завершена, данные обрабатываются". Сиди и жди.
|
laimas, я три раза уже написал, что вопрос не касается загрузки файла, а тебе посрать. И твое отслеживание - это анальная технология, под которую надо еще сервер настроить
Цитата:
И все равно ничего не поменяется в сущности. Ну или покажи как блин из php передать инфу в браузер, что строка обработана. Задолбал теоретег мамкин. |
Цитата:
|
laimas, ты же никогда его не применял, зачем тогда другим советуешь. И я не применял, и вообще нахер оно нужно? Ну зачем? Ну максимум отменить загрузку явно не пролезающего в лимит файла. Кроме того, я выше написал, что скорее всего через отправку заголовков можно устроить взаимодействие и эта анальная фича так и работает - через заголовки. Но только для загрузки. А тут нужна обработка, о которой блеать я сразу же написал, но до вас оленей пока дойдет, вы уже весь ягель выжрете в тундре. Лал.
|
warren buffet,
ты идиот, не я же порол хрень тут о загрузке файлов и бреде, что РНР в стороне, так что читай. И иди ты.... сам знаешь куда, пустотреп. |
В заблуждение могут ввести прогресс-бары объединяющие в себе отображение процесса загрузки с обработкой. Исходящие данные формируют очередь, эта очередь идет аяксом на сервер, один кусок за другим и прогресс весело показывает общую картину. Но в ней два плана - один загрузка файлов, второй - выполнение очереди.
Короче, задача вообще простая, ТЗ элементарное, надо просто сесть и написать скрипты. Если на сервер будет уходить больше чем 1 строка, решить сколько. Сервер должен понимать больше чем 1 и все. |
Цитата:
PHP в стороне при нормальной настройке сервера. Ты просто получаешь переменную $_FILE сразу, готовую, а файл уже в темпе. Так устроено? А чего ты еще опровергаешь? |
Ну то есть откуда по-твоему браузер берет данные о количестве загруженных байт, если никаких скриптов под это дело в PHP не предусмотрено?
|
Читай, а не чеши языком попусту, а об этом написано много как у разработчиков так и в дайджестах. Сеть богатая, найдешь.
Проплывай мимо. |
Опять ты порвался. Скотч надо? Лол.
У объекта XMLHttpRequest есть проперть upload, которая объект, который палит события loadstart, progress, load, loadend, error и никакой поддержки со стороны php не требуется. |
Цитата:
Проплывай мимо, с тобой у которого у всех "говнокод", а свой бред ты выдаешь за гениальность, говорить, это зря тратить время. |
laimas, Иди показывай GIF.
![]() Там где написано reddit там стоишь ты. ))) |
Во-во, тупые картинки, это и есть твой мир внутренний, это я давно уже тебе сказал. Любуйся своей "третьяковкой".
|
Фу какой ты депрессивный.
Вот хорошая гифка для загрузки. И никакого прогресс-бара не надо будет заказчику. ![]() |
Дурачкам вроде тебя может и нравится. Но тут не соц. болото для подобной хрени.
Ну коли умный, то почему не начать с клиента? Нет, вместо этого ты начал пороть бред о загрузке файлов, о котором ты и понятия не имеешь. Или тебе дать ссылку на твой код "якобы загрузки файлов РНР скриптом"? Ту бредядиту, что ты там написал это как раз в соц. болотах под такими туповатыми картинками, вот там они будут к месту. Или охота показаться знатоком всего и вся? Ну так потрудись хотя бы почитать прежде чем молоть языком всякую чепуху. А пишешь ты по N постов по всякому поводу. Такие портянки после тебя, что и тему листать не охота. Что очки зарабатываешь? Не волнуйся, получишь кепку после 1000. |
Цитата:
Ты реально задолбал своими разборками повсюду. Иди на первую страницу и прочти даун, О ЧЕМ я написал в первом же своем сообщении. Но вы положили, типа нипанатна и поперли обсуждать прогресс закачки. Поэтому пришлось провести лекцию о разнице закачки и обработки. Вот тебе ссылка, чтобы не мучился http://javascript.ru/forum/misc/6506...bootstrap.html |
Вот тебе клевая гифка на загрузку
![]() |
Цитата:
|
Воу-воу, господа! Так. Я проникся всем что прочитал. Ещё раз повторю вопрос свой последний. Если я посылаю асинхронный ajax запрос, то до того, как он дойдёт до конца, другие скрипты на странице не будут выполняться, я верно понял? Например, тот же таймер. А если будут, могу ли я параллельно считывать данные из файла. Любого txt файла, например считать строку через 5 секунд после начала выполнения асинхронного ajax запроса?
|
usesa,
просто начитать плясать от печки. Что есть некий индикатор? Этой шкале нужно знать что будем считать и какую величину взять за 100%. Так как и с загрузкой файла, так и загрузкой POST данных проблем не будет - клиент знает размер отправляемых данных, скорость соединения, просчитать и отобразить это на индикаторе не составит труда. Но загрузка ваших десятков тысяч строк, пусть это будет десятки/сотни Кб, это ведь при нормальном соединение малый промежуток времени. Если это отображать, то индикатор застынет где-то у конца. А что ему отображать далее, если клиент понятия не имеет через какое время ответит сервер? А это время у вас может достигать десятки секунд. И что вы собираетесь отображать? Включайте гифку, и весь индикатор тогда. А ведь можно и не ждать. Отправили данные, сервер подтвердил принято, клиент разорвал соединение. Вы как разработчик решаете прерывать ли работу серверного скрипта или нет. Можно продолжать работу, обрабатывая данные, можно их поставить в задачу для cron. Это не столь важно. Главное, что если обрабатываются строки и обрабатываются в цикле, то серверный сценарий уж точно может знать сколько ему по времени/процентах еще работать. Следовательно он может писать статус своей работы, а клиент после отправки данных уже в фоновом режиме опрашивает этот статус каждую секунду, отображая тот самый прогресс работы, который вы так хотите. |
Цитата:
Запрос потому и асинхронный, что функция ответа выполняется по событию. Пока этого события нет, все работает как обычно. Учи прерывания. Времеми на ожидание ответа тебе за глаза хватит. Посылай по одной строке и все будет меееедленно. Цитата:
Устроено вот так. 1 Сделали объект 2 Запрограммировали событие ответа = функция 3 Сделали запрос Все. Теперь когда ответ придет, та самая функция его и получит, когда придет. Обработает и запустит все снова, с строки 1. https://developer.mozilla.org/en-US/...XMLHttpRequest В лайбах вроде жиквери все уже уютненько. |
Цитата:
|
Цитата:
Не пудри читателю мозг. У него банальная задача сделать очередь загрузки аяксом. Есть 10К строк, он поделил на 100, получил 100, отгрузил 100, php обработал, что-то там сохранил, ответил 200 ОК и закрылся. Браузер получил, передал в скрипт, скрипт сдвинул прогресс на 1%, взял следующие 100, отгрузил 100, php обработал, что-то там сохранил, ответил 200 ОК и так далее пока строки не кончатся. По 100 уезжает, по 1% продвигается. Элементарно. Просто сервер придется дергать 100 раз. Ну и что? Он все равно железный. |
Если ты открываешь страницу на которой 100 фоток, то сервер будет дернут 100 раз. Ну и пусть дергается хоть на каждую строку. Это же явно административная задача.
|
Цитата:
Ну и главное, раз в секунду. То есть 60 раз в минуту дрыгать php, поднимать параллельный процесс, чтобы только файлик прочесть. Запросы по таймеру делаются когда данные поступают случайно и неизвестно откуда, скажем кто-то тебе написал привет, а он еще на сервере. В случае ТС данные конкретно все у него и все известно заранее. Сценарий выше. |
Поскольку ТС не колется о конкретике, то можно предполагать плохое. Например если для обработки важно получить все данные, какая-то статистика. Тогда прогресс будет показывать просто исход очереди на сервер, что и без таймеров заметно рендерится. Когда все строки из очереди отгрузятся, сервер запустит процесс обработки и тогда уже понадобится гифка с сиськами.
Вообще такая хрень через html не делается. Для этого есть shell и bash. Открыл консоль, запустил процесс и пялься себе на экран, смотри как он идет во всех подробностях. |
Цитата:
Плыви мимо, опять написал поноса на целый роман. |
Так-то рацзерно есть в мыслях у вас, судари. Но разбивать запрос поэтапно не выйдет хотя бы потому что строки сравниваются на потенциальные дубли и прочее. Не вижу возможности разбивать запрос порционно. Поэтому и ищу возможность выводить данные в процессе работы скрипта.
|
Часовой пояс GMT +3, время: 23:29. |