Анимация
JavaScript


Главная  Библионтека 

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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 [ 234 ] 235 236 237 238 239 240 241 242

END OF SELECT

If (@row = $sth->fetchrow()) {

(Scount, Sseconds) = @row, } else {

(Scount, Sseconds) = (0,0),

$sth->finish(), Sdbh->disconnect,

print headerO,

print tefflplate( report tpl , { username => Suser, count => Scount, total => Stotal

Если вам потребуется более изощренное и гибкое решение, рассмотрите второй шаблон решения, основанный на модуле Text::Template с CPAN. Содержимое пар фигурных скобок, обнаруженных в файле шаблона, вычисляется как код Perl. Как правило, расширение сводится к простой подстановке переменных:

You owe {Stotal}

но в фигурных скобках также могут находиться полноценные выражения:

The average was {$count (Stotal/Scount) 0)

Возможное примеиеиие этого шаблона продемонстрировано в примере 20.8.

Пример 20.8. userrep2

#/usr/bin/perl -w

# userrep2 - вывод данных о продолжительности работы пользователей

# с применением базы данных SOL

use Text Template, use DBI,

use CGI qw( standard),

Stmpl = /home/httpd/templates/fancy template ,

Stemplate = Text Template->new(-type => file , -source => Stmpl),

Suser = param( username ) or die No username ,

Sdbh = DBI->connect( dbi mysql connections mysql domain com 3306 ,

connections , secret passwd ) or die Couldn t db connect\n , Ssth = $dbh->prepare(« END OF SELECT ) or die Couldn t prepare SOL ,

SELECT COUNT(duration),SUM(duration)

FROM logins WHERE username= Suser END OF SELECT

Ssth->execute() or die Couldn t execute SOL ,



Ssth->finish(); Sdbh->dlsconnect;

print headerO;

print Stemplate->fill in();

При более широких возможностях этого подхода возникают онределен]]ые проблемы безопасности. Любой, кому разреше]1а запись в файл шаблона, сможет вставить в него код, выполняемый вашей программой. В рецепте 8.17 рассказано о том, как снизить этот риск.

t> Смотри также-

Документация но модулю Text-.Template с CPAN; рецепты 8.16; 14.10.

20.10. Зеркальное копирование Web-страниц

Проблема

Вы хотите поддерживать локальную копию Web-страницы.

Решение

Воспользуйтесь функцией mirror модуля LWP;;Simp]e;

use LWP;;Simple;

mirror(SURL, Slocal filename);

Комментарий

Несмотря на тесную связь с функцией get, онисаипой в рецепте 20.1, функция mirror не выпол]1яет безусловной загрузки файла. В создаваемый ей запрос GET включается заголовок If-Modif ied-Since, чтобы сервер передавал лишь недавно обновленные файлы.

Функция mirror копирует только одну страницу, а не целое дерево. Для копирования набора страниц следует использовать ее в сочетании с рецептом 20.3. Хороший вариант зеркального копирования целого удаленного дерева пр]1веден в программе w3mir, также находящейся на CPAN.

Будьте осторожны! Можно (и даже просто) написать программу, которая сходит с ума и начинает перекачивать все Web-страницы подряд. Это не только дурной тон, но и бесконечный труд, поскольку некоторые страницы генерируются

if (@row = $sth->fetchrow()) { ($count, Stotal) = @row;

} else {

Scount = Stotal = 0;



20.11. Создание робота

Проблема

Требуется написать сценарии, который са.мостоятелыю работает в Web (то есть робота). При этом желательно уважать правила работы удаленных узлов.

Решение

Вместо модуля LWP::UserAgent используйте в роботе модуль LWP::RobotUA:

use LWP:;RobotUA;

$ua = LWP::RobotUA->new(websnuffler/0.1 , me@wherever.com);

Комментарий

Чтобы жадные роботы не перегружали серверы, на узлах рекомендуется создавать файл с правилами доступа robots.txt. Если ваш cucnapnii получает лишь одш! документ, ничего страшного, по при получении множества документов с одного сервера вы легко перекроете пропускную способность узла.

Создавая собственные сценар1Н1 для работы в Web, важно помнить о правилах хорошего тона. Во-первых, не следует слишком часто запрашивать докуме]1ТЫ с одного сервера. Во-вторых, соблюда11те правила, описанные в файле robots.txt.

Са.мый простой выход заключается в создатщ агентов с применением модуля LWP::RobotUA вместо LWP::UserAgent. Этот агент автоматически «снижает обороты» при многократ]1ых обращешгях к одному серверу. Кроме того, он просматривает файл robots.txt каждого узла и проверяет, не пытаетесь ли вы принять файл, размер которого превышает максимально допустимый. В этом случае возвращается ответ вида:

403 (Forbidden) Forbidden by robots.txt

Следующий пример файла robots.txt получе]! программой GET, входящей в комплекс модулей LWP:

% GET http: www.webtechniques.com/robots.txt User-agent: •

Disallow: /stats

Disallow: /db

Disallow: /logs

Disallow: /store

Disallow: /forms

Disallow: /gifs

днна.мически. Кроме того, у вас могут возникнуть неприятности с теми, кто ие желает, чтобы их страницы загружались еп masse.

> Смотри также-

Документация по модулю LWP::Simple с CPAN; спецификация HTTP по адресу http: www.w3.or/pub/WWW/Protocols/HTTP/.



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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 [ 234 ] 235 236 237 238 239 240 241 242