Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пишем fcgi приложение на Perl, Точнее пытаемся. 
:(
    Опции темы
nagual2
  Дата 13.6.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 13.6.2009

Репутация: нет
Всего: нет



Если взять всем хорошо известный вариант 
http://habrahabr.ru/blogs/perl/53540/
и заменить tcp
Код
my $socket = FCGI:penSocket(":9000", 5);

на unixsocket  
Код
my $socket = FCGI:penSocket($filesock, 5);

а 
Код
while($request->Accept() >= 0) {

на 
Код
while (my $cgi = CGI::Fast->new()) {

точно как в мане
то начнется бурная жизнь воркеров
Код
FastCGI: server (pid 54999): initialized
FastCGI: manager (pid 54970): server (pid 54998) exited with status 0
FastCGI: manager (pid 54970): server (pid 55000) started
FastCGI: server (pid 55000): initialized
FastCGI: manager (pid 54970): server (pid 54995) exited with status 0
FastCGI: manager (pid 54970): server (pid 55001) started
FastCGI: manager (pid 54970): server (pid 54997) exited with status 0
FastCGI: server (pid 55001): initialized
FastCGI: server (pid 55002): initialized
FastCGI: manager (pid 54970): server (pid 55002) started
FastCGI: manager (pid 54970): server (pid 55000) exited with status 0
FastCGI: manager (pid 54970): server (pid 55003) started
FastCGI: manager (pid 54970): server (pid 55002) exited with status 0
FastCGI: manager (pid 54970): server (pid 55004) started
FastCGI: server (pid 55003): initialized
FastCGI: manager (pid 54970): server (pid 55001) exited with status 0
FastCGI: server (pid 55005): initialized
FastCGI: manager (pid 54970): server (pid 55005) started
FastCGI: server (pid 55004): initialized
FastCGI: manager (pid 54970): server (pid 54999) exited with status 0
FastCGI: manager (pid 54970): server (pid 55006) started

Видно где то баг.

По поводу класса 
Код
use POE::Component::FastCGI;

http://www.lexa.ru/nginx-ru/msg04244.html
Висит и не закрывает соединение.
Все попытки 
Код
$request->header( Connection => 'close' );

Неприводят к результату.

По поводу класса
Код
use FCGI::Async;

Неудалось скрестить с unixsocket.

Клас   
Код
require POE::Component::Server::HTTP;

Использовать нехочу потому что по tcp

Какие есть еще варианты?

ЗЫ Пока сделал так
Код
#!/usr/local/bin/perl -w
use strict;
use warnings;
use Data::Dumper;
use CGI;
##########################################################
use IO::All;
my $log_file="traf.log";
my $pid_file="/var/run/traf.pid";
my $filesock="/mnt/md0/test.sock";
my $verbose="1";
my $DEBUG=1;
################################################################################
use POSIX qw(strftime);
use English;
my $now_time = strftime "%a %b %e %H:%M:%S %Y", localtime;
if ($DEBUG) {
    addlog("\n$now_time [$PID]:Start daemons\n");
}
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
$mon++;$year += 1900;my $date=sprintf ("%4d%02d%02d%02d",$year,,$mon,$mday,$hour);
if ($DEBUG) {
    addlog("$now_time [$PID]:Prints date $date\n");
}
################################################################################
use FCGI;
use POSIX;
use FCGI::ProcManager qw(pm_manage pm_pre_dispatch pm_post_dispatch pm_change_process_name pm_write_pid_file);
fork_proc() && exit 0;
addlog("$now_time [$PID]:Demonize.\n");
POSIX::setsid() or die "Can't set sid: $!";
chdir '/' or die "Can't chdir: $!";
pm_write_pid_file($pid_file); #очень важно сделать это здесь а не ниже !
my $socket = FCGI::OpenSocket($filesock, 5);
system("chmod 777 $filesock");
POSIX::setuid(65534) or die "Can't set uid: $!"; 
my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket);
pm_manage(n_processes => 2);
reopen_std();
my $count = 1;
while($request->Accept() >= 0) {
pm_pre_dispatch();
&process_request($request);
pm_post_dispatch();
};
###############################################################################
sub fork_proc {
    my $pid;

    FORK: {
        if (defined($pid = fork)) {
            return $pid;
        }
        elsif ($! =~ /No more process/) {
            sleep 5;
            redo FORK;
        }
        else {
            die "Can't fork: $!";
        };
    };
};
###############################################################################
sub reopen_std {
    open(STDIN,  "+>/dev/null") or die "Can't open STDIN: $!";
    open(STDOUT, "+>&STDIN") or die "Can't open STDOUT: $!";
    open(STDERR, "+>&STDIN") or die "Can't open STDERR: $!";
};
###############################################################################
sub process_request {
    my ($request)=@_;
    my $env = $request->GetEnvironment();
    my ($in, $out, $err) = $request->GetHandles();
    my $q = new CGI($in);
    addlog("$now_time [$PID]:$env->{DOCUMENT_ROOT}$env->{REQUEST_URI}\n");
    print "Content-Type: text/html\r\n\r\n";
print "ok";
}
###############################################################################
sub shutdown {
    FCGI::CloseSocket($socket);#unlink ($pid_file) or die "Can't unlink $pid_file: $!";
    exit 0;
}
use sigtrap 'handler', \&shutdown, 'normal-signals';
###############################################################################
sub addlog  {
        my ($log_message) = @_;
        $log_message >> io($log_file);
}


Обсуждение начато здесь http://forum.sysfaq.ru/index.php?showtopic...mp;#entry383973

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.