2

私は、Perlで記述され、WebインターフェイスにMasonを使用するRequestTrackerをハッキングしています。オートハンドラー、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インターフェイスの必要な場所で使用できるようにしました。だから私はそれを1つのWebページで使用しようとします-オートハンドラーは次のことを行います:

% $m->call_next; 

<%INIT>
$RT::Logger->debug("my autohandler");
use RTx::FooBar::Web;
$session{cfWeb} ||= RTx::FooBar::Web->new();
</%INIT>

現在私を悩ませているのは(機能していないという事実を除いて)、「new」メソッドでのロギングは1回出力されますが、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 に答える