我正在处理一个 Perl 模块的部分,该部分创建了一个大型 CSV 响应。服务器运行在 Plack 上,而我对此并不是很熟悉。
目前,我正在使用类似以下的方式发送响应:
然而,
我不喜欢这个方法有两个明显的原因:首先,直到销毁
我尝试在文档中查找 答案,但没有找到所需内容。
我还尝试在回调部分调用
是否有一种方式可以发送 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
中,在所有行被处理后发送整个响应。我不喜欢这个方法有两个明显的原因:首先,直到销毁
$body
之前它会占用大量的 RAM。其次,在该方法完成工作并使用 $res->body($body)
实际发送响应之前,用户看不到任何响应活动。我尝试在文档中查找 答案,但没有找到所需内容。
我还尝试在回调部分调用
$res->body($row_object->to_csv)
,但似乎最终只发送我对 $res->body
的最后一次调用,覆盖了所有先前的调用。是否有一种方式可以发送 Plack 响应并在每一行上刷新内容,以便用户在收集数据时实时开始接收内容,而无需先累积所有数据到一个变量中?
非常感谢您的任何评论!
getline
方法的对象。如果需要更多细节,请发布一个简短但完整的示例。 - Sinan Ünürgetline
的简单对象,它工作得很好,除了Plack仍然缓冲响应并且在未定义->getline
之前不会向浏览器发送任何内容。关于我的示例,我修改了它使其更加自说明。发布我的真实代码唯一的真正区别是添加了许多不相关的行。我唯一想弄清楚的事情就是如何使Plack发送未缓冲/自动刷新的响应。 - Francisco Zarabozoget_data
函数。我想你的意思是query_data
。 - simbabque