是否存在与PHP ignore_user_abort()等效的mod_perl2 / Perl 5?

时间:2009-07-06 16:58:09

标签: perl http mod-perl mod-perl2

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

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

Perl有同等效力吗?我还没有找到一个。

2 个答案:

答案 0 :(得分:3)

好的,我明白了。

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();

答案 1 :(得分:0)

您可能希望查看为此使用作业队列。这是Zend提供的one,可以让你开始后台处理工作。对于php和perl,应该有很多这样的选择。

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