Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #68, АВГУСТ 2004 г.

Perl по-mod’ному

Докучаев Дмитрий aka Forb

Xakep, номер #068, стр. 068-108-3


2. В сценариях не должно быть служебных ключей _DATA_ и _END_.

3. В сценариях не должно быть функции exit(). Вместо нее используется Apache::exit().

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

Чтобы получить производительность при работе с БД, необходимо указать директиву PerlModule Apache::DBI (мы уже это сделали), а затем писать скрипт с использованием модуля DBI. Вот простой код register.cgi:

register.cgi – сценарий добавления нового пользователя

#!/usr/bin/perl

use CGI qw(:standard); ## Юзаем модуль CGI.pm

use DBI; ## и DBI

$name=param('name');

$info=param('info');

$cc=param('cc');

$cctype=param('type');

$holder=param('holder');

$exp=param('exp');

$cvv=param('cvv'); ## Собираем все необходимые параметры

my $r=shift;

$r-<send_http_header('text/html');

$r-<print("Connecting to db...\n"); ## Используя синтаксис Apache, шлем хидер

my $mysql=DBI-<connect("DBI:mysql:shop:localhost:3306","root","pwd") ||

$r-<print("cant connect"); ## Соединяемся с базой

$query=$mysql-<do("INSERT INTO cc \(name,info,cc,type,holder,exp,cvv2\) VALUES \(\"$name\",\"$info\",$cc,\"$cctype\",\"$holder\",\"$exp\",$cvv\)"); ## и выполняем запрос

$mysql-<disconnect; ## Дисконнект

Устанавливай атрибут 755 и делай запрос к скрипту. Ясен перец, что от тебя требуется явное определение всех необходимых параметров. Если все сделано правильно, сервер моментально выполнит соединение и модификацию таблицы.

Теперь, когда у тебя имеется одна (а может быть, и больше) строка в CC, колбась скрипт, который выводит данные в браузер.

list.cgi – сценарий просмотра таблицы CC по указанному id

#!/usr/bin/perl

use CGI qw(:standard); ## Юзаем модуль CGI.pm

use DBI; ## а также DBI

$id=param('id'); ## Получаем значение параметра id

my $r=shift;

$r-<send_http_header('text/html');

$r-<print("Connecting to db...\n"); ## Шлем хидер и сообщение о соединении (с помощью модуля Apache)

my $mysql=DBI-<connect("DBI:mysql:shop:localhost:3306","root","pwd") ||

$r-<print("cant connect"); ## Соединяемся с базой

$query=$mysql-<prepare("SELECT * from cc where id=$id"); ## Формируем запрос

$query-<execute; ## и выполняем его

row=$query-<fetchrow_array();

foreach(@row) {

$r-<print("$_\t"); ## Выводим построчно все возвращенные значения

}

$mysql-<disconnect; ## Дисконнектимся

Запрос вида www.host.com/perl/list.cgi?id=1 покажет тебе первый рекорд в таблице. Значения будут отделяться друг от друга табуляцией. Теперь попробуй обновить окно браузера. Ответ сервера происходит с минимальной скоростью, потому что в силу вступают механизмы кэширования и работа модуля Apache::DBI. А сейчас представь, что к твоей машине ломятся 100 клиентов одновременно. Только mod_perl способен быстро предоставить необходимую информацию из БД (естественно, не такую конфиденциальную, а, например, список товаров или услуг твоей электронной лавочки :)).

Вливайся!

Поздравляю! Только что ты прошел теоретический и практический курс работы с mod_perl. Надеюсь, ты понял, что модуль действительно является мощнейшим средством для web-разработок, когда сервер не должен простаивать даже долю секунды. Работу с данным модулем практикуют такие порталы, как ValueClick, CMPnet и CitySearch. Я думаю, если ты познакомишься с mod_perl чуть поближе, то никогда не будешь оглядываться по сторонам в поиске новых решений для своего web-проекта. А программеры-энтузиасты всегда подкинут тебе искомый модуль, заюзав который, ты сэкономишь драгоценное время.

Назад на стр. 068-108-2  Содержание  Вперед на стр. 068-108-4