Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > end : Private and begin : Private catalyst


Автор: gcc 19.2.2009, 16:15
1) как сделать чтобы часть кода была во всех методах сразу при вызове (чтобы не писать одно и тоже)?

Код

sub begin : Private { 
   my ($self, $c) = @_;
   my $dbh = $c->model('DBI')->dbh;
   
       if ($c->user_exists() > 0) { 
    $c->stash->{user_admin} = 1 if ($c->user->{user}->{username} eq 'admin');
    $c->stash->{user_username} =  $c->user->{user}->{username};
    }

    $c->stash->{user_exists} = $c->user_exists();    
}

в других метода ошибка от use strict что $dbh не инициализирован....

2) как уничтожыть соединение от бызы во всех методах    $dbh->disconnect();

так по-моиму не правильно...
Код

sub end : Private {
   my ($self, $c) = @_;
   $c->forward('MyApp::View::HTML::Template');
   $dbh->disconnect();
}


в документации написано нормально, но примеров реальных я не ивдел, не знаю как тут сделать..

кстате, не кто не видел большую программу на каталисте чтобы исходники посмотреть? 


Автор: sir_nuf_nuf 19.2.2009, 17:33
зачем вам уничтожать соединение руками ? сервер дофига быстрый  ? =) 
вам нужно только
Код

 $c->model('DBI')->dbh

и далее делает что хотите.. зря что ли люди писали Model::DBI


как не писать везде.. интересный вопрос.
Вообще в OOP для этого используют наследование или делегацию.
В Catalys - есть такая фича - если begin/end/process не определен в каком -то контроллере, то будет предпринята попытка
вызвать его у корневого контроллера  (тот который YourApp/Сontroller/Root.pm)

определите свои методы. там. и при необходимости перекрывайте их

(замечу еще раз - это не наследование!)

Было бы клево, если бы вы проверили -  Catalyst проходит при поиске действия все контроллеры в иерархии или только Root.pm

Автор: gcc 20.2.2009, 03:06
Цитата(sir_nuf_nuf @ 19.2.2009,  17:33)
зачем вам уничтожать соединение руками ? сервер дофига быстрый  ? =) 

тогда не надо писать $dbh->disconnect(); ?


вот типо работает:

Код

sub auto : Private {
    my ( $self, $c ) = @_;
    my $dbh = $c->model('DBI')->dbh;
    $c->stash->{'dbh'} = $dbh;

     if ($c->user_exists() > 0) {
    $c->stash->{user_admin} = 1 if ($c->user->{user}->{username} eq 'admin');
    $c->stash->{user_username} =  $c->user->{user}->{username};
    }
    $c->stash->{user_exists} = $c->user_exists();

    return 1;
}


sub end : ActionClass('RenderView') {}

sub end : Private {
   my ($self, $c) = @_;
   $c->forward('MyApp::View::HTML::Template');
   my $dbh = $c->model('DBI')->dbh;
   $dbh->disconnect();
}

Автор: gcc 20.2.2009, 03:26
http://github.com/jrockway/angerwhale/blob/95da08ea31d2005de3b21f93049e89ffcc0ffaf7/lib/Angerwhale/Controller/Captcha.pm

подскажите, пожалуйста, что делают приватные методы, точнее как они вызываються? (именно код мне комментировать не надо)

когда эти методы приватные вызываються и как? в других классах их не видно? не могу понять в чем смысл от этих методов?

Код


sub captcha_uri : Private {
    my ($self, $c) = @_;
    return if $c->stash->{user}; # XXX user
    return if $c->session->{got_captcha};
    return $c->uri_for('/captcha/captcha');
}
  
=head2 check_captcha($guess)
 
Returns true if the guess is the text in the captcha.
 
=cut
 
sub check_captcha : Private {
    my ($self, $c, $guess) = @_;
 
    return unless ref $c->session->{captcha};
    
    if($c->session->{got_captcha} || $c->session->{captcha}->{rnd} eq $guess){
        $c->session->{got_captcha} = 1; # only need to guess one per session
        return 1;
    }
    return;
}

Автор: sir_nuf_nuf 20.2.2009, 13:40
gcc, ты имел в виду private actions ?
работают точно так же как и другие, но Catalyst не сопоставляет их ни с какими URL.
Другими словами private action нельзя вызвать HTTP запросом, можно только из другого action.. наприрмер так:

Код

sub check : Global {  #/check
    my ($self, $c) = @_;
    $c->forward($c->action('check_captcha'));
}

sub check_captch : Private {
    # bla bla
}


Вообщем их можно вызывать через
$c->forward
$c->detach
$c->visit

Автор: gcc 20.2.2009, 13:46
sir_nuf_nuf, спасибо, понял


этом примере по ссылке котрую я написал, они нигде не вызываються

они в других контроллерах вызываються наверное...


по первому посту такая ошибка:
Caught exception in MyApp::Controller::Root->auto "DBD::mysql::st execute failed: MySQL server has gone away at /usr/local/lib/perl5/site_perl/5.8.8
/Catalyst/Plugin/Authentication/Store/DBI.pm line 175.
"

появляется ошибка через раз...

Автор: sir_nuf_nuf 20.2.2009, 14:16
gcc, код смотреть.. как же еще )

Автор: gcc 20.2.2009, 14:27
извените, я плохо выразился

если это поставить, то такая ошибка...

Код

sub begin : Private { 
   my ($self, $c) = @_;
   
       if ($c->user_exists() > 0) { 
    $c->stash->{user_admin} = 1 if ($c->user->{user}->{username} eq 'admin');
    $c->stash->{user_username} =  $c->user->{user}->{username};
    }
    $c->stash->{user_exists} = $c->user_exists();    
}

Автор: sir_nuf_nuf 20.2.2009, 14:32
gcc, "это" - это аттрибут Private ?  В каком контроллере ?

Автор: gcc 20.2.2009, 14:42
sir_nuf_nuf,  я нашел это не из-за privat

я ошибку нашел тут

Код

sub end : Private {
   my ($self, $c) = @_;
   $c->forward('MyApp::View::HTML::Template');
   my $dbh = $c->model('DBI')->dbh;
   $dbh->disconnect();
}


если убрать $dbh то работает...

но как отключатся от базы?

Добавлено через 5 минут и 57 секунд
Цитата(sir_nuf_nuf @ 20.2.2009,  14:32)
gcc, "это" - это аттрибут Private ?  В каком контроллере ?

кстате, а какая разница в каком от контроллере?

если метод check_captcha : Private  не запускается в том контроллере где он есть... он где угодно может же запуститься, если я правильно понял...

Автор: sir_nuf_nuf 20.2.2009, 14:56
Цитата(gcc @  20.2.2009,  14:42 Найти цитируемый пост)
но как отключатся от базы?

а зачем ? Если у вас mod_perl или FCGI - тогда наоборот надо поддерживать соединения для производительности.
А если CGI - то они сами закроются.

Автор: gcc 20.2.2009, 15:05
Цитата(sir_nuf_nuf @ 20.2.2009,  14:56)
а зачем ? Если у вас mod_perl или FCGI - тогда наоборот надо поддерживать соединения для производительности.

это "пул соединений"? когда его включаю на С++ прогармме и когда идет сбой, то MyISA таблица разваливается, и восстанавливатся не хочет, надо заходить в консоль MySQL и только руками восстанаваливать, "REPAID table"

Добавлено @ 15:09
Цитата(sir_nuf_nuf @ 20.2.2009,  14:56)
А если CGI - то они сами закроются.

это точная информация?

я когда-то сидел тестировал долго без метода дисконекта и сервер mysql мне ответил что "сервер гон" из-за того что много соединений висит...

их конечно надо рубать, но на хостинге например только дается только определенное количество соединений в час...  а потом не будет отвичать пользователю, таймаутов там нету почему-то




Автор: gcc 21.2.2009, 14:15
кто знает скажи как дисконект сделать, может быть как-то можно переблагословить?

Автор: gcc 22.2.2009, 16:34
извените, не подумал что есть "уничтожитель" в Catalyst-Model-DBI

а подключение делать не надо, можно просто писать my $sth = $c->model(’DBI’)->dbh->prepare

Автор: gcc 2.8.2009, 14:35
все таки как отключиться от базы автоматически?

мне каталист говорил что превышен max_connect_user, что делать? это из-за того что нету $dbh->disconnect;?
 
на сервер еще работает сайт на пхп, 1000 хостов - все номрально

в Catalyst::Model::DBI 

видно:
Код

sub disconnect {
        my $self = shift;
        if( $self->connected ) {
                $self->_dbh->rollback unless $self->_dbh->{AutoCommit};
                $self->_dbh->disconnect;
                $self->_dbh( undef );
        }
}

sub DESTROY {
        my $self = shift;
        $self->disconnect if (defined $self->_dbh);
}



я так понял что оно не разрывает соединение где-то?

Автор: gcc 4.8.2009, 19:58
подскажите как исправить это? 

как посмотреть какое запрос "висит"?  если это можно, какие варианты?

Автор: gcc 6.8.2009, 23:11
Цитата(sir_nuf_nuf @ 19.2.2009,  17:33)
зачем вам уничтожать соединение руками ? сервер дофига 

что вы имеете ввиду?

включить pool connect? как это включить?
(что-то я не нашел в чем проблема, там извратили что-то из сессиями и авторизаций, сделали какие-то странные запросы...)

...эти запросы висят и со временем подключение к mysql становиться не возможным

Код

mysql> show processlist ;
Current database: catalyst_db
+-------+----------+-----------+-------------+---------+------+-------+------------------+
| Id    | User     | Host      | db          | Command | Time | State | Info             |
+-------+----------+-----------+-------------+---------+------+-------+------------------+
| 60339 | catalyst | localhost | catalyst_db | Sleep   |  707 |       | NULL             | 
| 60340 | catalyst | localhost | catalyst_db | Sleep   |  707 |       | NULL             | 
| 60343 | catalyst | localhost | catalyst_db | Sleep   |  680 |       | NULL             | 
| 60344 | catalyst | localhost | catalyst_db | Sleep   |  681 |       | NULL             | 
| 60361 | catalyst | localhost | catalyst_db | Sleep   |  630 |       | NULL             | 
| 60362 | catalyst | localhost | catalyst_db | Sleep   |  630 |       | NULL             | 
| 60381 | catalyst | localhost | catalyst_db | Sleep   |  441 |       | NULL             | 
| 60382 | catalyst | localhost | catalyst_db | Sleep   |  441 |       | NULL             | 
| 60417 | catalyst | localhost | catalyst_db | Sleep   |  380 |       | NULL             | 
| 60418 | catalyst | localhost | catalyst_db | Sleep   |  380 |       | NULL             | 
| 60429 | catalyst | localhost | catalyst_db | Sleep   |  184 |       | NULL             | 
| 60430 | catalyst | localhost | catalyst_db | Sleep   |  184 |       | NULL             | 
| 60462 | catalyst | localhost | catalyst_db | Sleep   |  122 |       | NULL             | 
| 60463 | catalyst | localhost | catalyst_db | Sleep   |  122 |       | NULL             | 
| 60470 | catalyst | localhost | catalyst_db | Sleep   |   67 |       | NULL             | 
| 60472 | postfix  | localhost | postfix     | Sleep   |   34 |       | NULL             | 
| 60473 | postfix  | localhost | postfix     | Sleep   |   34 |       | NULL             | 
| 60475 | postfix  | localhost | postfix     | Sleep   |   34 |       | NULL             | 
| 60476 | postfix  | localhost | postfix     | Sleep   |   64 |       | NULL             | 
| 60477 | postfix  | localhost | postfix     | Sleep   |   34 |       | NULL             | 
| 60484 | root     | localhost | catalyst_db | Query   |    0 | NULL  | show processlist | 
+-------+----------+-----------+-------------+---------+------+-------+------------------+
21 rows in set (0.00 sec)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)