【发布时间】:2011-01-27 23:28:59
【问题描述】:
我有一个在 mod_perl 中运行的 Perl 脚本,它需要向客户端写入大量数据,可能需要很长时间。我观察到的行为是,一旦我打印和刷新某些内容,即使我 rflush 也不会回收缓冲内存(我知道操作系统无法回收它)。
这就是 mod_perl 的运作方式吗?有没有办法可以强制它定期释放缓冲内存,以便我可以将其用于新的缓冲区,而不是从操作系统中获取更多?
澄清一下,我自己没有使用任何缓冲区,我的代码也没有泄漏。考虑以下简单示例:
sub handler {
my $request = shift;
my $boundary = time;
$request->content_type("multipart/x-mixed-replace;boundary=\"$boundary\";");
for (;;) {
$request->print("--$boundary\n");
$request->print("Content-type: text/html; charset=utf-8;\n\n");
$request->print("$data\n\n");
$request->rflush;
}
return Apache2::Const::OK;
}
这严重泄漏,我的请求保持有效,因此它可能会活跃数天。
【问题讨论】:
-
澄清一下,我自己没有使用任何缓冲区,我的代码也没有泄漏。考虑以下简单示例:
sub handler { my $request = shift;我的 $boundary = 时间; $request->content_type("multipart/x-mixed-replace;boundary=\"$boundary\";"); for (;;) { $request->print("--$boundary\n"); $request->print("内容类型: text/html; charset=utf-8;\n\n"); $request->print("$data\n\n"); $request->rflush; } 返回 Apache2::Const::OK; }这严重泄漏,我的请求保持活动状态,因此它可能会活跃数天。