我正在研究 Request Tracker,它是用 perl 编写的,并使用 Mason 作为 Web 界面。我正在尝试制作一个自定义页面,其中涉及一个自动处理程序、一个 html 页面,并在其他组合中引入了一些方法。我有一个简单的类,我想用它来跟踪我的部分界面所需的一些东西。现在它跟踪的只是一个数据库句柄。
package RTx::FooBar::Web;
use strict;
use warnings;
use RTx::FooBar::Handle;
sub new
{
my $proto = shift;
$RT::Logger->debug("creating new");
my $class = ref($proto) || $proto;
my $self = {};
bless( $self, $class);
my $handle = RTx::FooBar::Handle->new();
$handle->Connect();
$self->{cfHandle} = $handle;
return $self;
}
sub DESTROY {
my $self = shift;
$RT::Logger->debug("destroy");
delete $self->{cfHandle};
}
sub CFHandle
{
my $self = shift;
return $self->{cfHandle};
}
1;
我尝试将其粘贴到会话中,以便可以在 Web 界面中任何需要的地方使用它。所以我尝试在一个网页中使用它——自动处理程序会:
% $m->call_next;
<%INIT>
$RT::Logger->debug("my autohandler");
use RTx::FooBar::Web;
$session{cfWeb} ||= RTx::FooBar::Web->new();
</%INIT>
现在困扰我的事情(除了它不工作的事实)是“新”方法中的日志记录打印了一次,但 DESTROY 方法中的日志记录打印了 56 次。每次,RTx::FooBar::Handle->DESTROY 中的调试也会打印出来,表明 $self->{cfHandle} 没有被删除。任何人都可以提出为什么会发生这种情况吗?是因为会话是绑定哈希吗?
*更新* 我不再使用 $session,它在创建一次后仍然破坏了我的句柄 56 次。