Прогресс-индикатор

Материал из Eludia
Перейти к: навигация, поиск
Lrt.gif

В Eludia имеются процедуры для текстового варианта прогресс-индикатора в стиле старых алфавитно-цифровых интерфейсов. Вы можете либо воспользоваться этим API, либо разработать свой индикатор, пользуясь некоторыми из нижеописанных приёмов.

Предположим, вам требуется сформировать 3 объёмных DBF-файла, после чего запаковать их в ZIP и выдать на клиент. Вы уверены, что все эти действия в одну секунду не уложатся. Чтобы пользователь не чувствовал себя подвешенным в пустоте, первой же строкой напечатайте HTML-заголовок и сообщение о том, что придётся немного подождать (lrt_start). Далее каждые, скажем, 100 или 1000 строк рапортуйте о промежуточном успехе (lrt_ok). Аналогично – по окончании записи каждого файла. В последнюю очередь печатается скрипт, перенаправляющий клиента на сгенерированный файл (lrt_finish).

lrt_start ();
 
while (...) { 
 ...
 lrt_print ('Загружаем ...');
 ...
 lrt_ok ();

}

lrt_finish ('Процесс завершён', esc_href ());

В реализации нашего API используется тот факт, что браузер отрисовывает страницу не после окончательной загрузки, а по мере поступления HTML. Причём это выражается не только в отображении гипертекста, но и в исполнении скриптов. Так что если каждое промежуточное сообщение сопровождается фрагментом js-кода, заключённым в элемент <script>, например, прокручивающим окно на нижнюю строку, то код этот станет исполняться и пользователь всегда будет видеть последние строки. Впрочем, интертпретация DHTML идёт не совсем построчно, а определёнными порциями – на стороне клиента имеет место своя буферизация. Но особой проблемы это не преставляет: достаточно нагрузить каждую стоку-сообщение комментарием величиной больше буфера (для MSIE 6 подходит 8 Кб) – и вы получите отображение в реальном времени.

Несмотря на то, что DHTML индикатора предельно прост, его объём сам по себе в пределе может вызвать переполнение памяти на клиенте. Если вы столкнётесь с такой проблемой, можно разбить процедуру на ограниченные шаги и передавать управление от одного к другому со стороны клиента, например, функцией window.open.

Если вы пользуетесь реверсным проксированием с буферизацией, то использовать прогресс-индикатор невозможно. Также следует учесть, что выдача без буферизации невозможна, если используется сжатие трафика gzip. Для конфигурации Nginx / FastCGI необходимо установить параметр gzip off, иначе lrt функции не будут работать. Параметры по-умолчанию модуля ngx_http_fastcgi_module, относящиеся к размеру и количеству буферов nginx при получении ответа от FastCGI сервера, могут отличаться в зависимости от платформы. Иногда для получения сообщений lrt_print необходимо уменьшить объём буферов.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Разработчику
Администратору
Инструменты