如何编写在HTTP响应发送到客户端后运行的Plack中间件



我的Plack web服务通过TCP连接到fluentD进行日志记录,我想在将响应发送回客户端后执行日志记录代码。这将减少响应时间(假设这是一个高请求量的服务,值得进行这样的性能优化(。

至少有一个其他的web框架express for nodejs通过允许中间件向请求对象添加一个端事件处理程序来支持这一点。我查看了Plack::Request和Plack::Response接口,但没有看到类似的事件挂钩。

我想我可能可以在中间件中对finalize方法进行本地覆盖,以迫使框架在响应完成后进行日志记录,但如果可能的话,我希望避免对Plack内部进行修补。

有没有更好的方法可以将某些代码的执行推迟到向客户端发送响应之后?

感谢LeoNerd和ilmari在MagNET#io-async中提供的调试帮助。

#!/usr/bin/env -S plackup -s Net::Async::HTTP::Server
use Future::AsyncAwait;
use Time::HiRes qw(time);
use Future::IO qw();
use Future::IO::Impl::IOAsync qw();
async sub mylogger {
# simulate expensive run-time
await Future::IO->sleep(1);
open my $log, '>>', '/tmp/so-58605156.log';
$log->say(time);
}
my $app = sub {
my ($env) = @_;
mylogger->retain;
return [200, ['Content-Type' => 'text/plain'], [time]];
};

相关内容

  • 没有找到相关文章

最新更新