2

我正在研究 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 次。

4

1 回答 1

1

这里只是一个猜测 -$session从外部化版本(可能通过 Storable 等)重新创建您的对象。所以它在没有调用的情况下取回对象,new所以没有日志记录。不知道为什么它每次都会被摧毁。

它看起来$session实际上是一个绑定的哈希,一个Apache::Session或实现相同接口的东西(文档谈论数据库支持会话)。

如果您想拥有一个全局持久对象(即,不绑定到单个请求),那么给它一个完全限定的名称,例如,$RTx::FooBar::Web::TheObject ||= RTx::FooBar::Web->new();或使用类似Cache::MemoryCache. 或者,在设置中设置您自己的全局变量MasonAllowGlobals,尽管您可能需要进入 RT 的配置文件来更改它。

于 2012-06-15T00:54:12.530 回答