1

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

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

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

4

2 回答 2

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();
于 2009-07-06T17:32:13.847 回答
0

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

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

于 2009-07-06T17:05:20.157 回答