• Earth’s Geomagnetic Pole Reversal

  • Декілька нових доробків вашого покірного слуги


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

    Запускаем из под root.
    Кол-во процессов потомков определяем в скрипте. Часть имени процесса хранится в фале конфигурации bin/Core/Config.pm


    #!/usr/bin/perl
     
    use strict;
    use FCGI;
    use POSIX;
     
    # Для распараллеливания и слежением за потомками
    use FCGI::ProcManager qw( pm_manage pm_pre_dispatch pm_post_dispatch );
     
    # Для обновления измененных модулей на этапе разработки
    use Module::Refresh;
     
    #use lib '/Users/zaur/www/blacktiger/bin';
    use FindBin qw($Bin);
    use lib "$Bin/../bin";
    use Core;
    use Core::Config;
    use Core::Sql;
     
    # Избавляемся от родительского процесса
    fork_proc() && exit 0;
     
    # Запуск новой сессии
    POSIX::setsid() or die "Can't set sid: $!";
     
    # переход в корень, чтобы не мешать отмонтированию файловой системы
    chdir '/' or die "Can't chdir: $!";
     
    # смена пользователя на nobody
    POSIX::setuid('www') or die "Can't set uid: $!";
    # смена группы пользователя на www
    POSIX::setuid('www') or die "Can't set uid: $!";
     
    # Открываем сокет
    # слушаем порт 9004, в соответствии с конфигом в nginx
    my $socket = FCGI::OpenSocket(":9004",5);
     
    # начинаем слушать
    #my $req = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket);
    # на этапе расработки при посылке мынеджеру процессов сигнала TERM он прибьёт потомков СРАЗУ
    # не дожидаясь пока они отработают запросы
    my $req = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket, FCGI::FAIL_ACCEPT_ON_INTR);
     
    # Начинаем распараллеливание, с указанием кол-ва обработчиков
    pm_manage(n_processes => 2, pm_title => 'perl-'.$cfg{host}.'-manager');
     
     
    # коннект к бд
    my $dbh;
    eval {$dbh = Core::Sql::db_connect();};
    if ($@) {
    	print $@,$/;
    	#exit;
    }
     
    # Переоткрываем стандартные дескрипторы
    reopen_std();
     
    my $count = 1;
    $0 = 'perl-'.$cfg{host}.'-child';
     
    # debug
    $SIG{__DIE__} = sub {
    	my $text = shift;
    	Core::Tools::zhalt({}, "ERROR: $text");
    	#next ZEXIT; # этот переход не нужен, так как уже будет совершен переход из zhalt
    	#exit(0);
    };
     
    # Собственно циклическая обработка запросов
    ZEXIT:
    while ($req->Accept() >= 0) {
    	# Распараллеливание. Реакция на внешнее вмешательство
    	pm_pre_dispatch();
     
    	# Begin process request
     
    	# проверка коннекта к БД
    	unless ($dbh->ping()) {
    		eval {$dbh = Core::Sql::db_connect();};
    		if ($@) {
    			print "Content-Type: text/plain\n\n";
    			print "$$: " . $count++,$/; # pid процесса
    			print $@,$/;
    			next;
    		}
    	}
     
    	# Использовать на этапе разработки
    	my $refresher = new Module::Refresh;
    	$refresher->refresh_module('Core.pm');
    	$refresher->refresh_module('Core/Config.pm');
    	$refresher->refresh_module('Core/Tools.pm');
    	$refresher->refresh_module('Core/Init.pm');
    	$refresher->refresh_module('Core/Sql.pm');
    	$refresher->refresh_module('Core/Objects.pm');
    	$refresher->refresh_module('Core/Processing.pm');
    	for my $t (@templates) {
    		my $cl = 'Core/'.$t->{pm}.'.pm';
    		$refresher->refresh_module( $cl );
    	}
     
    	# eval на этапе разработки
    	# сюда передать handler для БД
    	#eval { Core::init($count++,$dbh); };
    	#if ($@) {
    	#	die $@;
    	#}
     
    	# в рабочем режиме
    	Core::init($count++,$dbh);
     
    	# End process request
     
    	# Распараллеливание. Реакция на внешнее вмешательство
    	pm_post_dispatch();
     
    }
     
     
    # close request
    FCGI::CloseSocket($socket);
     
    # форк
    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: $!";
    		}
    	};
    }
     
    # Перенаправляет стандартные дескрипторы на /dev/null
    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'r open STDERR: $!";
    }




  • Earth’s Geomagnetic Pole Reversal

  • Декілька нових доробків вашого покірного слуги