【问题标题】:RequestTracker and Mason destroying my class over and over againRequestTracker 和 Mason 一次又一次地摧毁我的班级
【发布时间】:2012-06-15 00:20:59
【问题描述】:

我正在研究 Request Tracker,它是用 perl 编写并使用 Mason 用于网络界面。我正在尝试制作一个自定义页面,其中涉及一个自动处理程序、一个 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;

我尝试将其粘贴到会话中,以便可以在需要的任何地方使用它 它在网络界面中。所以我尝试在一个网页中使用它 - 自动处理程序会:

% $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 是绑定哈希?

*更新*我不再使用 $session,它在创建一次后仍然破坏了我的句柄 56 次。

【问题讨论】:

    标签: perl mason rt


    【解决方案1】:

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

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

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

    【讨论】:

    • 实际上,如果可能的话,我不希望它持续超出请求。我曾经尝试过使用 RTx::FooBar::Web 的单例版本,它可以工作,但在用户之间共享数据库句柄并不是一个好主意。
    • 别忘了梅森也有&lt;%cleanup&gt;。在顶级自动处理程序&lt;%init&gt; 中设置您的对象,将其存储在您自己的MasonAllowGlobals 变量中,并在&lt;%cleanup&gt; 中销毁(或简单地取消设置它)
    • MasonAllowGlobals 是由所有同时请求共享的全局变量吗?
    • MasonAllowGlobals 只是在页面运行的命名空间中声明了一个特定变量(我认为是HTML::Mason::Commands)。我认为它不会进行任何初始化或清理。该变量在每个 perl 解释器中都是全局的,这通常意味着每个 apache 进程;它不会在真正同时的请求之间共享。但是,如果未重新初始化,它将与由同一解释器运行的后续请求共享。如果您发现每 5 次重新加载页面就会发生一些奇怪的事情,请查找未清理的全局变量。
    • 这很奇怪——我在standalone_handler 中运行,而不是Apache。我停止使用 $session,它仍然调用 DESTROY 处理程序 56 次。
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 2017-01-11
    • 2021-11-14
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多