Главная
Новости
Статьи и обзоры
Горожанин
Обнинск в Internet
Web Design
Hardware
Software
Безопасность
Серфинг
Игродром
Relax
Технологии
Web-обзор
Интернет-ликбез
Опросник
УП-Технологии
ART.net
Ссылки
Архив
О нас
Контакты
Форумы
Основатель: К.Николаенко
Главный Редактор: С.Коротков
Web Design: Neutron
|
|
= Web-Дизайн =
АРХИТЕКТУРА КРУПНЫХ ФОРМ
(с) Артемий Ломов
Давно прошли те времена, когда веб-ресурсы были в большинстве своем пассивными. Сегодня интернет-проектам требуется многоплановое и хорошо отлаженное взаимодействие с пользователем. Различного рода процедуры регистрации, опросы, форумы, не говоря уже об онлайновых магазинах, зачастую требуют заполнения посетителем обширных форм и обработки сервером внушительных порций пользовательских данных.
POST-МОДЕРНИЗМ
Как известно, метод POST сам по себе не налагает ограничений на объем пользовательских данных, передаваемых в теле НТТР-запроса от клиента серверу. Длина переданной последовательности хранится в переменной окружения CONTENT-LENGTH. Для получения пользовательских параметров скрипт использует чтение стандартного ввода при помощи, как правило, функции sysread. Если в силу особенностей проектируемого приложения объем передаваемых ему пользовательских данных предполагается небольшим (от силы 2-3 килобайта), вполне допустимо использовать простую конструкцию:
$content_length =
$ENV{CONTENT_LENGTH};
sysread(STDIN, $query,
$content_length);
Следует, однако, помнить, что sysread - это функция блокового чтения бинарных данных, причем длина блока является ограниченной. При попытке обработать вышеописанным способом достаточно длинный запрос "хвост" последнего будет обрезан, что, безусловно, повлечет ошибки при анализе пользовательских параметров. Решение проблемы состоит в применении временного буфера небольшого фиксированного размера. Фрагмент кода, отвечающий за чтение пользовательского запроса, целесообразно оформить в виде отдельной подпрограммы, сделав в ней все переменные локальными:
sub parse_query
{
my $query = ";
my $content_length =
$ENV{'CONTENT_LENGTH'};
if ($content_length)
{
my $buffer = ";
while (sysread(STDIN, $buffer, 1024))
{
$query .=$buffer;
}
# Сюда помещаются инструкции
кода для разбора строки запроса,
декодирования имен и значений
параметров.
}
}
Как видно из приведенного примера, переменная $query, которая в конечном итоге будет содержать пользовательский запрос, складывается из небольших килобайтных порций (блоков) данных в ходе выполнения цикла while. Вообще говоря, при разработке сколь-либо сложных скриптов (размером, скажем, больше 50 строк) нужно стремиться разбивать их код на подпрограммы. Это, во-первых, позволяет более рационально расходовать память машины благодаря использованию локальных переменных, а во-вторых, обеспечивает удобочитаемость и логическую стройность кода фактически при любом объеме.
Продолжение следует.
|
|