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

标签 perl asynchronous middleware deferred-execution plack

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

至少还有一个其他 Web 框架(express for Nodejs)通过允许中间件添加 on-end event handler to the request object 来支持这一点。 。 我看过Plack::RequestPlack::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/

相关文章:

java - Java 异步如何工作?异步方法似乎没有异步运行

python - FastAPI - 如何在中间件中获取响应正文

linux - Damn Small Linux 上的 CGI Perl 脚本和 Monkey Web 服务器

ruby - 使用 Perl 或 Ruby 提取 Excel 单元格注释的最佳方法是什么?

perl - 如何在 Perl 中向 STDERR 输出添加时间信息?

c# - 不使用 Task.Run() 安排工作时如何处理并发?

javascript - Selenium:尝试从 Perl 调整窗口大小:出现神秘的 JavaScript 错误

javascript - DOM 操作是否异步(当使用浏览器提供的 API 时,如 getElementById 或appendChild)?

node.js - Express.js 中间件分支或多个 app.routes 中间件

node.js - Nodejs/Express POST 请求中间件无法在回调中调用 next()