2009-07-06 55 views
1

我正在写一个内部服务,需要触摸一个长时间运行的进程的mod_perl2实例。这个工作是从HTTP POST中触发的,并且他们的mod_perl处理程序将其选中并完成工作。这可能需要很长时间,并且可以异步处理,所以我希望在运行时可以终止HTTP连接。是否有与PHP的ignore_user_abort()等效的mod_perl2/Perl 5?

PHP有一个函数ignore_user_abort(),当与正确的头文件结合使用时,可以提前关闭HTTP连接,同时使进程继续运行(此技术在此处提及几次)。

Perl是否具有相同的功能?我还没有找到一个。

回答

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

你可能想看看使用一个作业队列。这里是由Zend提供的one,它可以让你开始后台处理工作。应该有一些这些可供选择的PHP和Perl。

这里是另一个线程,谈论this问题和article在一些PHP选项。我不是贝尔和尚,所以我会把这些工具的建议留给别人。

相关问题