Анимация
JavaScript
|
Главная Библионтека Как запустить сво офамму и "убедить" сервер оставить заголовки нетронутыми - зависит от самого Web-сервера. Работая, например, с Web-сервером Apache, о(5ь«ио достаточно, чтобы имя файла CGI-профаммы начиналось с префикса nph-. Например, файл с именем push.cgi будет обрабатываться как CGF-профамма с анализируемыми заголовками, а файл с именем sh.cgi - как CGI-программа без анализа заголовков. Однако администратор Web-сервера может изменить описанную выше схему наименования Под управлением сервера 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-программу без анализа заголовков (см. описание в предыдущем разделе). ССа-огрма времен сервером . . . . П: И/ивг/Ып/регХ -w 6; $1=1; # Eiairaa авташижжая очистка 4: 7: 8: print multipart init; 9: while(l) { 10: print aultipart start; 11: print "jytoime время <H1>", scalar{localtiine), "</Hl>\n"; 12: print fflultipart end; sl 5; 13: 14: Проведем анализ программы. • Строка 4. При загрузка Модуля необходимо указать, что ет выполняться в режиме выталкивания страниц, поэтому данная строка содержит директиву :push для модуля CGI. Кроме того, при написании сценариев без анализа заголовков необходимо уведомить об этом модуль CGI с помощью аргумента -nph. • Строка 8. Функции rt init информирует броузер о том, что далее будет следовать составная Web-страница. Эта функция используется вместо функции header в обычнтх Web-страницах. • Строка 9. С помощью выражение Ше (1) создается цикл while, который будет повторяться бесконечно долго. • Строка 10. Функции rt start отмечает начало обновляемой страницы. Если страница уже отображается, эта строка заставляет броузер очистить ее и ожидать приема нового содержимого. • Строка 11. Эта строка представляет собой содержимое составной страницы. Как упоминалось на 4-м занятии, "Укладка строительных блоков: списки и массивы", функция localtime в скалярном контексте выводит время в формате "Sun Sep 5 15:15:30 1999". • Строка 12. Функция multipartend отмечает конец обновляемой страницы. За этой строкой может следовать только другая функция multipart start или конец программы. Обратите внимание на то, что функции raultipartinit и raultipartend находятся в теле цикла while. Этот цикл снова и снова отображает одну и ту же страницу: в ней меняется лишь значение времени суток. Еще один пример: анимация графического изображения В следующем примере (листинг 23.2), который во многом напоминает предыдущий, отображается набор изображений из каталога /images. Они отображаются поочередно с использованием режима выталкивания страниц. Вначале выполняется чтение всех файлов из каталога, а затем их содержимое поочередно посылается броузеру в виде набора "вытолкнутых" страниц. Листинг 23.2. Графическая анимация с использованием режима вкивания страниц bin/perl -w 3: strict; 4: ОЗЕ qw{ :puBh -nph); 5: ny($3irege±ir, ejPEGS); 6: \ Заунмгэ ИУЯ калнгсга Ш реалЕнэе 7: $iiiBgedii?="AjeD/ClinlxnTest Arfia/images; 8: opendir(iD, $ппвдес31г) Jf die "СПкйа rpi сащыши $ittBgedir: $1"; 9: §JPEGS=sort grep{/\. jpg$/, readdir ID); 10: closedir{I}; U: 12: $[=1; ♦ EQ:5aiHa автоувтжсзая снизгка буффа В: 14: pdnt multipart init; 15: fciceadiny $ image (JPEGS) { 16: pdnt itultdjart start(-tipe => image/jpeg)? 18: apen(IMA6E, Simagedir/Simage) )l die "Оийкагрюозьпки $iiiiage: $!"; 19 binmode (IMAGE); I ТЬлько для Wind /95/98 20: print MA; 21: close(IMAGE); 22: print aultipart end; 23: sleep 5; 24: ) представленная в листинге 23.2, большей частью напоминает программу вывода изображения дня и ночи, приведенную на 20-м занятии, "Работа -с HTML-кодом и CGI-программами", и пример, содержащийся в листинге 23.1. Важным элементом, на который стоит обратить внимание, является строка 16: multipart start(-type => iraage/jpeg). Она означает, что вместо вывода обычного текста или документа HTML на последовательных Web-страницах CGI-программа будег выводить изображения в формате JPEG. Для выполнения анимации CGI-программа должна либо напрямую выводить JPEG-файлы, либо выводить HTML-код, содержащий дескрипторы <1МЗ SRO. Сравнение с методом вытаскивания страниц клиентом Другой метод последовательной загрузки Web-страниц предполагает участие клиента. В соответствии с этим методом в HTML-код помешаются дескрипторы, указывающие броузеру на необходимость перезагрузки той же страницы (или страницы с другим URL), в которых указывается интервал времени. Например, приведенный ниже HTML-дескриптор, помещенный в раздел <HEAD> Web-страницы, должен заставить броузер загрузить страницу http: foo.bar.comчерез 6 секунд. <МЕТА Hm-EQUIV="refresh" СОКТЕКТ="6;http: foo.bar.com"> Модуль косвенно поддерживает директивы загрузки страниц по запросу клиента. При выводе заголовка Web-страницы с помощью аргумента -Refresh функции header модуля CGI можно указать, что данная страница должна быть перезагружена или на ее место будет загружена другая страница: prin Refresh => 6;URL=http: foo.bar.com); В действительности участие клиента заключается в загрузке новой страницы между "обновлениями". Это означает, что если у вас есть страницы, которые необходимо отобразить в определенной последовательности (как при показе слайдов), вам нужно с помощью файлов cookie или параметров, встроенных в URL, отслеживать эту последовательность, т.е. то, какая страница должна быть отображена следующей. В период между обновлениями между сервером и клиентом должно быть установлено новое соединение, и Web-сервер должен запустить новую Perl-программу для каждого обновления. А это, скорее всего, означает, что обновления не могут происходить слишком быстро. Ниже перечислены основные проблемы, возникающие при использовании любого из описанных выше методов загрузки некоторой последовательности страниц (путем выталкивания сервером или вытаскивания клиентом). • Некоторые броузеры не поддерживают режим выталкивания страниц "силами" сервера, в частности броузер Internet Explorer. • Некоторые броузеры не поддерживают режим вытаскивания страниц "силами" клиента. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 [ 110 ] 111 112 113 114 115 116 117 118 119 120 121 122 |