2

我们刚刚将一个相当大的代码库从古老的 Perl 5.005.03 CGI 环境移植到 mod_perl 2,现在它正在进行公开测试,我们不时遇到一些可能相关的问题。这些会累积起来,直到我们必须重新启动服务器。

我们所有的代码都在 use strict 下编译,但之前被称为编译、运行和丢弃的 CGI 脚本。到目前为止我们遇到的问题:使用旧式全局文件句柄(而不是)设置$|或调用。还调用- 在我们开始公测后不久,我们发现例如 /bin/tail 或 /usr/sbin/sendmail 在端口 80 和 443 上监听,这阻止了服务器重新启动。从那以后,我重写了该代码以使用纯 Perl 方法,我们不再有这个问题。STDOUT->autoflush(1);open(ERRORFILE, $errorfile)open(my $fh_error, $errorfile)system()

仍然存在两个问题。第一个是日志充满了 mod_perl 抱怨常量已被重新定义,例如

Constant subroutine ModPerl::ROOT::ModPerl::PerlRun::usr_local_..._cgi_forgotpassword::O_CREAT redefined at /usr/lib/perl5/ModPerl/Util.pm line 69.

此外,有时看似核心的变量会被丢弃。我们的核心内部模块之一记录有关 PID 和脚本名称的信息,并生成如下信息:

20090202-233948-32154:Started script /usr/local/.../cgi/account/renewalcalendar
20090202-233948-32154:Ended script /usr/sbin/apache2

在其他时候,进程 ID 将以undef. 这是罕见且间歇性的。

其次,也是间歇性的,我们偶尔会看到垃圾收集没有启动。(可能是弱引用的问题?但几乎所有时间一切正常。)最直接的症状是打开的数据库句柄从不关闭,但是当我深入研究这个问题时,很明显在标准 Perl 哈希对象中存储了一个 DBI 对象,并且该对象的DESTROY方法(很少和间歇性地)没有被调用。

我们正在运行 Debian 5.0 (Lenny)、Perl 5.10.0、Apache 2.29、mod_perl 2.0.4、openSSL 0.9.8g。如有必要,我可以提供更多信息,但我认为这是基础。

apache 配置的显着部分,即/etc/apache2/sites-enabled/*sitename*,是(出于保密原因编辑了一些位):

<VirtualHost ...:443>
<Directory />
    Options SymLinksIfOwnerMatch
    AllowOverride None
</Directory>
<Directory /usr/local/.../cgi>
    SetHandler perl-script
    PerlResponseHandler ModPerl::PerlRun
    PerlOptions +ParseHeaders
    Options +ExecCGI
</Directory>
</VirtualHost>

那里有一些 SSL、重写和重定向的东西,但这是重要的东西。

这听起来很熟悉吗?或者,任何人都可以推荐任何进一步调试问题的方法吗?

4

1 回答 1

2

For your memory problem: you need to call weaken (from standard module Scalar::Util)

于 2009-02-03T01:14:22.940 回答