Мое веб-приложение использует модуль Log для записи различных событий. Объект журнала инициализируется передачей объекта CGI :: Session, содержащего различную информацию о пользователе. Эта информация копируется в поля данных объекта журнала. В связи с объемом активности на сайте и тем фактом, что одно посещение сайта может привести к нескольким регистрируемым событиям, модуль журнала в настоящее время кэширует все события в памяти, а затем фактически записывает их в файл журнала в функции DESTROY. Однако это приводит к зависанию параметров сеанса во время инициализации объекта журнала, что происходит в начале запроса.
В последнее время необходимо было зарегистрировать некоторые новые параметры, которые а) будут сохраняться в объекте сеанса, и б) должны регистрироваться как их конечное значение, а не как исходное значение (и потенциально могут измениться во время выполнения),Моя первоначальная идея заключалась в том, чтобы вместо этого сохранить ссылку на объект сеанса в объекте журнала, но так как функция DESTROY обычно вызывается при глобальном уничтожении, я не могу гарантировать, что объект сеанса все еще будет определен при уничтожении журнала. Есть ли способ гарантировать, что объект CGI :: Session не будет уничтожен перед моим журналом, надеюсь, без необходимости явного уничтожения каждой страницы приложения?
#old
package Log;
sub new
{
my $class = shift;
my $session = shift; #CGI::Session
my $self = {session => {customer_id => $session->param('customer_id')}, events => []};
return bless $self, $class;
}
sub log_event
{
my $self = shift;
my $event = shift;
push @{$self->{'events'}}, {event_type => $event->{'type'}, timestamp => $event->{'timestamp'}};
}
sub DESTROY
{
my $self = shift;
if (scalar @{$self->{'events'}})
{
open LOG, "/tmp/log";
print LOG, Dumper({session => $self->{'session'}, events => $self->{'events'}});
close LOG;
}
}
#new
package Log;
sub new
{
my $class = shift;
my $session = shift;#CGI::Session
my $self = {session => $session, events => []};
return bless $self, $class;
}
sub log_event
{
my $self = shift;
my $event = shift;
push @{$self->{'events'}}, {event_type => $event->{'type'}, timestamp => $event->{'timestamp'}};
}
sub DESTROY
{
my $self = shift;
if (scalar @{$self->{'events'}})
{
open LOG, "/tmp/log";
print LOG, Dumper({session => {customer_id => $self->{'session'}->param('customer_id')}}, events => $self->{'events'}});
close LOG;
}
}