5

我开始使用 Catalyst 编写一些 Perl 代码,如下所示:

package My::Controller;
extends 'Catalyst::Controller';

sub handler :Path :Args(0) :Location( some/url )
    my ($self, $c) = @_;

    $self->do_something_with_arguments($c);
    $self->make_a_decision($c);
    $self->another_method($c);
}

然后我想。o O(为什么总是传递 $c ?),我改为:

package My::Controller;
extends 'Catalyst::Controller';

has c => (is => "rw", isa => "Catalyst");

sub handler :Path :Args(0) :Location( some/url )
    my ($self, $c) = @_;
    $self->c($c);

    $self->do_something_with_arguments;
    $self->make_a_decision;
    $self->another_method;
}

处理程序只有一个入口点,因此 $self->c 将始终正确设置。

我的同事说,如果这就是 Catalyst 的用途,那么,每个人都会这样使用它。他们担心这样做会导致内存泄漏,因为对 $c 的引用会在请求结束后持续存在。真的吗?

4

1 回答 1

10

这并不是大多数人所认为的确切意义上的“内存泄漏”,因为它不会导致无限的内存增长,但是是的,您将请求上下文保持在比其正常生命周期更长的时间。下次您发出设置$self->c为其他内容的请求时,它将被释放,但不会很快。更重要的是,这几乎只是错误的设计。继续将上下文作为参数传递;或将您的控制器方法转换为私有操作并调用它们->forward(自动传递上下文);或在适当的情况下将事物移入模型中,并拥有模型ACCEPT_CONTEXT

于 2013-02-11T16:04:20.570 回答