我正在攻击使用Perl编写并使用Mason的Request Tracker 用于Web界面。我正在尝试制作一个自定义页面,它涉及一个自动处理程序,一个html页面,并在其他comps中引入一些方法。我有一个简单的类,我想用它来跟踪我的界面部分需要的一些东西。现在一切都好 tracks是一个数据库句柄。
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-&gt; DESTROY也打印出来,表明这一点 $ self-&gt; {cfHandle}未被删除。任何人都可以建议为什么会这样 发生了什么?是因为session是一个绑定的哈希?
* 更新 * 我不再使用$ session,并且在创建一次后仍然会将我的句柄破坏56次。
答案 0 :(得分:1)
这里只是一个猜测 - $session
正在从外化版本(可能通过Storable等)重新创建对象。因此它在没有调用new
的情况下返回对象,因此没有记录。不知道为什么每次都会被摧毁。
看起来$session
实际上是一个绑定的哈希,一个Apache::Session
或者实现相同接口的东西(文档谈论会话的数据库支持)。
如果您想拥有一个全局持久对象(即,不依赖于单个请求),请为其指定一个完全限定的名称,例如$RTx::FooBar::Web::TheObject ||= RTx::FooBar::Web->new();
或使用类似Cache::MemoryCache
的内容。或者,在MasonAllowGlobals
设置中设置自己的全局变量,尽管您可能需要进入RT的配置文件来更改它。