LINUX.ORG.RU

perl, fastcgi, разработка веб-приложений на perl вообще.


0

3

Написал fascgi perl программу. Ну всё по howto. Вопрос возник на счёт переменных имеющих отношение к конкретному запросу. Где их, спрашивается, хранить. Им быть our по отношению к модулю никак нельзя (он же разные запросы отрабатывает). Я их сразу после получения запроса local делаю (из-за чего no strict vars) и дальше до возврата из функции всё отрабатывается, генерируется ответ. Может как-то по-другому можно?

И с шаблонами тоже (HTML::Template). Шаблоны при загрузке программы все считываются в переменные. Потом через Storable делается dclone для переменной с шаблоном, шаблон модифицируется и отдаётся в ответ, потом уничтожается. Может я опять как-то нетрадиционно всё делаю? Но всяко лучше, чем шаблон подгружать и создавать заново во время запроса.

Вообще хотелось бы что-то типа «сессий». Постоянного набора переменных живущих в сеансе работы пользователя, между разными запросами. Как сделать? Только не надо mysql вспоминать как это делает на пыхэхэ... Во-первых без всяких SQL, да и даже без BerkeleyDB. Дурдом это. Да и пользователей там не over9000000, и данных не много. Можно в переменных. Если потом приспичит можно же через tie с БД на диске увязать? Как делают, нормально, без пыхэпэ и SQL?

Про шаблоны тоже вопрос. HTML::Template безобразен до ужаса. Вообще тут php (не)добрым словом вспоминается. Только не в таком как php виде. Скорей макросистемы из Tcl. Чтоб переменные автоподставлялись и ограниченный ряд функций можно было вызвать из шаблона, когда он раскрывается. Но код чтоб в шаблоне не писать как пхп-программисты. Есть какие-то библиотеки и т.п.? Вообще хотелось бы некого дуализма в подходе генерации веб-страниц. С одной стороны как шаблона, с другой как объекта меняемыми свойствами и методами получения HTML.

Ещё об организации веб-приложения в целом. Хотелось бы как-то упорядочить всё, нужна какая-то методика, как это делать. Не знаю. Хотя бы всё в ООП завернуть, чтоб были классы страниц например, которые уже на относительно высоком (не уровня полей шаблона) берут данные, пропускают их через шаблон, отдают HTML или что там. Хоть почитать как это делается. Чтоб не говнокодить как на пхп. Опять же не знаю. Но без тяжёлых фреймворков типа django и т.п. --> в них ногу сломишь, в них масса своих проблем, и они вобщем-то на другие задачи расчитаны. А мне высокореактивное и надёжное приложение на выходе нужно, пусть и без лишних свистелок и колокольчиков.

Ещё заметил, это жутко неудобно через CGI::Simple вручную cookies разбирать и потом ставить, вручную же парсить параметры запроса и т.п. Напрашивается опять же более высокоуровневая ООП-прослойка. С умением сериализовать объекты в куки и т.п. Кстати, CGI без Simple в fastcgi режиме нифига не работает, ерроры даёт, память куда-то девается. Опять же не знаю как это делается. Я вообще веб тольком никогда не программировал. Только GUI немного и системный уровень.


Жуть какая... Посмотрите на Mojolicious, ибо «в них ногу сломишь» воспринимается только как следствие вашего невежества. Не обязательно брать весь фреймворк, достаточно отдельные компоненты, он (Mojo) задумывался как фреймворк для создания web-фреймворков.

outtaspace ★★★
()

Код из примера, на обычном ноутбуке 2009го года, в development-режиме (в продакшене чуть быстрее) показывает результат 2500 запросов в секунду. Только один воркер задействован (а в FCGI мы можем сколько угодно включить). Вас не устроит latency в 0.0003s?

#!/usr/bin/env perl

use Mojolicious::Lite;
use English qw( -no_match_vars );

get '/get_data' => sub {
    my $self = shift;

    $self->res->headers->header( 'Content-Type' => 'text/plain; charset="UTF-8"' );

    $self->render( text => qq{в процессе $PID} );
};

app->start;
outtaspace ★★★
()

Как выше советовали Mojo. А так можете, например, memcache.

anonymous
()

Кстати, CGI без Simple в fastcgi режиме нифига не работает, ерроры даёт, память куда-то девается. Опять же не знаю как это делается.

Кстати, советую полностью отказаться от CGI.pm (любых версий), ибо жуткое чудовище с невероятным количеством ошибок. Недавно полностью выпилил его из унаследованного проекта (это ~500 cgi-скриптов, весьма забористых, олдскульных). Нужны были только use CGI qw( param upload remore_user remote_host ); - я реализовал как обертку над Mojo::Message::Request и могу поделиться кодом.

CGI может работать как FCGI. Только учтите что «cgi такой cgi» - он расчитан на схему «один старт скрипта» === «один http-запрос». При старте скрипта CGI.pm читает из STDIN и парсит %ENV. Внутри FCGI-цикла надо вызывать CGI->_reset_globals();

Потом вы столкнетесь с тем что CGI::upload() портит файлы *.doc, произвольным образом (в любую часть файла) добавляя к ним 2 байта, решите подебажить, испугаетесь, заглянете в тесты и снова испугаетесь.

Только GUI немного и системный уровень

Это сразу заметил. Такие как вы пишут в соответствующем стиле (код ниже) и экономят на спичках (бесконечные оптимизаторы и беспощадные улучшенцы).

my @array = ();
outtaspace ★★★
()

Вопрос возник на счёт переменных имеющих отношение к конкретному запросу. Где их, спрашивается, хранить.

Делаете класс для запроса, храните в члене класса.

level1 ★★
()

Да, CGI ужасен, для разбора запроса могу порекомендовать CGI::Minimal (всё отлично работает в fastcgi), для Cookies можно использовать CGI::Cookie.

Сессии можно хранить как угодно, хоть в виде глобального хеша.

disarmer ★★★
()

ЗАЧЕМ в 2012 году писать сайты на ненужном, непригодном для веб языке, без нормальных шаблонизаторов, работающие через cgi???

Alve ★★★★★
()
Ответ на: комментарий от level1

Да что угодно. Просто непонятно, как человеку не лень столько колёс переизобретать и зачем обязательно брать самые старые модули, какие только можно найти.

Hoodoo ★★★★★
()
Ответ на: комментарий от Alve

Какой язык для web пригодный, где есть годные хорошие шаблонизаторы работающие через FastCGI?

fk0
() автор топика
Ответ на: комментарий от fk0

А бабы не пригодны для секса. Вставайте на четвереньки, сейчас вас научат.

level1 ★★
()
Ответ на: комментарий от fk0

В смысле «работающие через FastCGI?

Берёшь любой шаблонизатор, пишешь шаблон, из скрипта потом вызываешь его, передаёшь данные в шаблон и получаешь обратно свою страницу, какая-то „специальная“ поддержка нужна разве?

Вместо

my $template = HTML::Template->new(filename => 'test.tmpl')
$template->param(HOME => $ENV{HOME});
пишешь
my $template = Template->new;
my $vars = {
    var1  => $value,
    ...
};
my $input = 'myfile.tt';
$template->process($input, $vars)

Hoodoo ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.