我正在创建一个大型 CSV 响应的 Perl 模块的一部分。服务器在 Plack 上运行,我对它远非专家。
目前我正在使用这样的东西来发送响应:
$res->content_type('text/csv');
my $body = '';
query_data (
parameters => \%query_parameters,
callback => sub {
my $row_object = shift;
$body .= $row_object->to_csv;
},
);
$res->body($body);
return $res->finalize;
但是,该query_data
函数不是一个快速的函数,并且会检索很多记录。在那里,我只是将每一行连接起来$body
,并且在处理完所有行之后,发送整个响应。
我不喜欢这个有两个明显的原因:首先,它需要大量的 RAM 直到$body
被销毁。其次,在该方法完成工作并实际发送响应之前,用户看不到响应活动$res->body($body)
。
我试图在文档中找到答案,但没有找到我需要的东西。
我也尝试调用$res->body($row_object->to_csv)
我的回调部分,但似乎最终只发送我最后一次调用$res->body
,覆盖所有以前的调用。
有没有办法发送一个 Plack 响应来刷新每一行的内容,所以用户在收集数据时开始实时接收内容,而不必先将所有数据累积到一个可验证的数据中?
提前感谢您的任何评论!