我的 Plack Web 服务通过 TCP 连接到 FluentD 进行日志记录,我想在将响应发送回客户端之后执行我的日志记录代码。这将减少响应时间(假设这是一个高请求量服务,值得进行这样的性能优化)。
至少还有一个其他 Web 框架(express for Nodejs)通过允许中间件添加 on-end event handler to the request object 来支持这一点。 。 我看过Plack::Request和 Plack::Response接口(interface),我没有看到类似的事件钩子(Hook)。
我想我可以对 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]];
};
关于perl - 如何编写一个在 HTTP 响应发送到客户端后运行的 Plack 中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58605156/