【问题标题】:Is there a mod_perl2/Perl 5 equivalent to PHP's ignore_user_abort()?是否有与 PHP 的 ignore_user_abort() 等效的 mod_perl2/Perl 5?
【发布时间】:2010-11-08 10:52:30
【问题描述】:

我正在编写一个内部服务,它需要为一个长时间运行的进程访问 mod_perl2 实例。该作业从 HTTP POST 触发,mod_perl 处理程序将其拾取并完成工作。这可能需要很长时间,并且已准备好进行异步处理,因此我希望可以在 HTTP 连接运行时终止它。

PHP 有一个函数ignore_user_abort(),当与正确的标头结合使用时,可以提前关闭 HTTP 连接,同时保持进程运行(此技术在 SO 中提到过几次)。

Perl 有等价物吗?我还没找到。

【问题讨论】:

    标签: perl http mod-perl mod-perl2


    【解决方案1】:

    好的,我想通了。

    Mod_perl 在这里有 PHP 的“相反”问题。默认情况下,mod_perl 进程保持打开状态,即使连接被中止,PHP 默认关闭进程。

    Practical mod_perl book 说明如何处理中止的连接。

    (顺便说一句,就这个特定问题而言,列表中的作业队列低于“断开连接”http 进程)

    #setup headers
    $r->content_type('text/html');
    $s = some_sub_returns_string();
    
    $r->connection->keepalive(Apache2::Const::CONN_CLOSE);
    $r->headers_out()->{'Content-Length'} = length($s);
    
    $r->print($s);
    $r->rflush();
    
    #
    # !!! at this point, the connection will close to the client
    #
    
    #do long running stuff
    do_long_running_sub();
    

    【讨论】:

      【解决方案2】:

      您可能需要考虑为此使用作业队列。这是 Zend 提供的one,它可以让您启动后台处理作业。对于 php 和 perl,应该有许多可供选择的。

      这是另一个讨论this 问题和article 一些php 选项的线程。我不是 perl 和尚,所以我会将这些工具的建议留给其他人。

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多