Поиск

Что такое push-технология

Традиционная Web-технология является по своей природе постраничной. Она мало приспособлена для просмотра больших документов, особенно когда речь заходит о медленных каналах связи.

В качестве примера рассмотрим Web-страницу, запускающую CGI-программу, которой требуется для выполнения очень много времени. Скажем прямо, шанс, что пользователь дождется окончания загрузки такой страницы, очень невелик.

Во-первых, броузер может прервать сеанс связи из-за окончания интервала ожидания завершения работы CGI-программы. Броузеры обычно ожидают результатов примерно в течение 90 секунд, а затем отображают сообщение, уведомляющее о том, что данный узел недоступен.

Во-вторых, CGI-программа время от времени может выводить сообщение: "Выполнено 10% работы", а несколькими мгновениями спустя: "Выполнено 20% работы" и т.д. Вывод подобных сообщений — дело хорошее, но дело в том, что они могут не появляться через одинаковые интервалы времени (из-за буферизации), и в результате вы получите чрезвычайно медлительную Web-страницу.

Вероятно, было бы лучше, чтобы сообщения, уведомляющие о состоянии загрузки Web-страницы, выводил броузер (рис. 23.1).

В push-технологии (server push), или технологии выталкивания страниц сервером, используется преимущество того факта, что броузеры могут получать страницы по разделам и повторно отображать эти страницы в нужной последовательности, как если бы вы сами последовательно загрузили различные страницы.

На момент написания этой книги броузер Internet Explorer компании Microsoft еще не поддерживал протоколы, необходимые для реализации push-технологии серверами. И это весьма печально, поскольку использование этой возможности предоставляет простой способ выполнения анимации содержимого Web-страниц. Для создания Web-страниц, корректно отображающихся в Internet Explorer или других броузерах, не поддерживающих push-технологию, следует использовать другие методы, например метод вытаскивания страниц самим клиентом (client pull).
Организация работы сервера в режиме выталкивания страниц

Чтобы обеспечить работу Web-сервера в режиме выталкивания страниц, его нужно соответствующим образом настроить. Для этого необходимо запустить CGI-программу на сервере в режиме, в котором не анализируются выводимые ею заголовки. В этом случае сервер не требует от CGI-программы вывода заголовков и пересылает данные "как есть" напрямую броузеру. Обычно Web-серверы анализируют результаты работы CGI-программ, чтобы убедиться в их корректности (вот откуда возникает ошибка с кодом 500!). При отсутствии анализа заголовков CGI-программа посылает результаты своей работы прямо броузеру, как показано на рис. 23.2.

Как запустить свою CGI-программу и "убедить" сервер оставить заголовки нетронутыми — зависит от самого Web-сервера. Работая, например, с Web-сервером Apache, обычно достаточно, чтобы имя файла CGI-программы начиналось с префикса nph-. Например, файл с именем push.cgi будет обрабатываться как CGI-программа с анализируемыми заголовками, а файл с именем nph-push.cgi — как CGI-программа без анализа заголовков. Однако администратор Web-сервера может изменить описанную выше схему наименования CGI-программ.

Под управлением сервера Internet Information Server (IIS) компании Microsoft все CGI-программы выполняются как программы без анализа заголовков; функция header модуля CGI обычно скрывает этот факт от вас. Поэтому для работы Web-сервера I IS в режиме выталкивания страниц не нужно вносить никаких изменений.

Если вы не знаете, как запустить CGI-программу без анализа заголовков, обратитесь к документации по Web-серверу или проконсультируйтесь у системного администратора.

Маленький пример: обновление часов

В качестве первого примера работы сервера в режиме выталкивания страниц напишем простую программу, обновляющую часы на Web-странице. Часы работают за счет того, что сервер примерно каждые 5 секунд будет отправлять броузеру очередную страницу с новым временем. Web-сервер будет продолжать выталкивать страницы до тех пор, пока броузер не "уйдет" с этой страницы или пользователь не шелкнет на кнопке броузера Остановить (Stop), чтобы прекратить процесс загрузки страницы.

В модуле CGI предусмотрен набор функций, разработанных для упрощения процесса выталкивания страниц сервером. Web-страницы, обновляемые сервером, также называются составными документами (multipartdocuments).

В листинге 23.1 представлен исходный код CGI-программы вывода времени сервером. Вам нужно ввести этот код и сохранить его в файле с таким именем, чтобы Web-сервер мог выполнить его как CGI-программу без анализа заголовков (см. описание в предыдущем разделе).

Проведем анализ программы.

  • Строка 4. При загрузке CGI-модуля необходимо указать, что он .будет выполняться в режиме выталкивания страниц, поэтому данная строка содержит директиву :push для модуля CGI. Кроме того, при написании сценариев без анализа заголовков необходимо уведомить об этом модуль CGI с помощью аргумента -nph.
  • Строка 8. Функция multipart init информирует броузер о том, что далее будет следовать составная Web-страница. Эта функция используется вместо функции header в обычных Web-страницах.
  • Строка 9. С помощью выражения while(l) создается цикл while, который будет повторяться бесконечно долго.
  • Строка 10. Функция multipart start отмечает начало обновляемой страницы. Если страница уже отображается, эта строка заставляет броузер очистить ее и ожидать приема нового содержимого.
  • Строка 11. Эта строка представляет собой содержимое составной страницы. Как упоминалось на 4-м занятии, "Укладка строительных блоков: списки и массивы", функция localtime в скалярном контексте выводит время в формате "Sun Sep 5 15:15:30 1999".
  • Строка 12. Функция multipart_end отмечает конец обновляемой страницы. За этой строкой может следовать только другая функция multipart start или конец программы.

Обратите внимание на то, что функции raultipart_init и raultipart_end находятся в теле цикла while. Этот цикл снова и снова отображает одну и ту же страницу: в ней меняется лишь значение времени суток.

Еще один пример: анимация графического изображения ,

В следующем примере (листинг 23.2), который во многом напоминает предыдущий, отображается набор изображений из каталога /images. Они отображаются поочередно с использованием режима выталкивания страниц. Вначале выполняется чтение всех файлов из каталога, а затем их содержимое поочередно посылается броузеру в виде набора "вытолкнутых" страниц.

Программа, представленная в листинге 23.2, большей частью напоминает программу вывода изображения дня и ночи, приведенную на 20-м занятии, "Работа с HTML-кодом и CGI-программами", и пример, содержащийся в листинге 23.1.

Важным элементом, на который стоит обратить внимание, является строка 16: multipart start(-type => 'image/jpeg'). Она означает, что вместо вывода обычного текста или документа HTML на последовательных Web-страницах CGI-программа будет выводить изображения в формате JPEG. Для выполнения анимации CGI-программа должна либо напрямую выводить JPEG-файлы, либо выводить HTML-код, содержащий дескрипторы <IMG SRС>

Сравнение с методом вытаскивания страниц клиентом

Другой метод последовательной загрузки Web-страниц предполагает участие клиента. В соответствии с этим методом в HTML-код помешаются дескрипторы, указывающие броузеру на необходимость перезагрузки той же страницы (или страницы с другим URL), в которых указывается интервал времени. Например, приведенный ниже HTML-дескриптор, помещенный в раздел <HEAD> Web-страницы, должен заставить броузер загрузить страницу http://foo.bar.com через 6 секунд.

Модуль CGI косвенно поддерживает директивы загрузки страниц по запросу клиента.

При выводе заголовка Web-страницы с помощью аргумента -Refresh функции header модуля CGI можно указать, что данная страница должна быть перезагружена или на ее место будет загружена другая страница:

В действительности участие клиента заключается в загрузке новой страницы между "обновлениями". Это означает, что если у вас есть страницы, которые необходимо отобразить в определенной последовательности (как при показе слайдов), вам нужно с помощью файлов cookie или параметров, встроенных в URL, отслеживать эту последовательность, т.е. то, какая страница должна быть отображена следующей. В период между обновлениями между сервером и клиентом должно быть установлено новое соединение, и Web-сервер должен запустить новую Perl-программу для каждого обновления. А это, скорее всего, означает, что обновления не могут происходить слишком быстро.

Ниже перечислены основные проблемы, возникающие при использовании любого из описанных выше методов загрузки некоторой последовательности страниц (путем выталкивания сервером или вытаскивания клиентом).

  • Некоторые броузеры не поддерживают режим выталкивания страниц "силами" сервера, в частности броузер Internet Explorer.
  • Некоторые броузеры не поддерживают режим вытаскивания страниц "силами" клиента.

Какой бы из методов вы ни использовали при написании CGI-программ, они в чем-то окажутся несовместимыми с тем или иным броузером. Тем не менее вам придется принимать решение по выбору "наименьшего зла" и писать соответствующий программный код.