2010-01-05 54 views
4

我使用$r->pool->cleanup_register(\&cleanup);在处理页面并将其打印到客户端后运行子例程。我希望客户端能够看到完整的页面,并且Apache可以在后台花费几秒钟继续进行一些处理。为什么当我在mod_perl中注册清理处理程序时,浏览器会挂起?

但客户端浏览器挂起,直到清理子文件已返回。有没有办法让我的代码已经返回之前让apache完成与客户端的连接

我确信我以前做过这件事,但我无法再找到它。

回答

1

使用作业队列系统并完全异步执行长操作 - 只需在Web请求期间安排操作即可。作业队列还可以处理高峰负载情况,而不是在Web服务器进程中进行昂贵的处理。

+0

++我同意,如果可能的话,完成网络服务器之外的任务。 如果有任何问题(等待锁等),这可能会导致apache实例无法为请求提供服务,并使用Apache的所有内存来执行(可能很简单)的工作。我以前见过这个原因很大...... 如果你不能在你的宿主环境中设置一个cron作业或类似的东西,看看你是否可以fork/exec一个单独的进程来处理这个任务。 – FalseVinylShrub 2010-01-08 05:10:19

0

您想要flush the buffer.它并未完成连接,但您的客户端将在任务完成前看到输出。

sub handler { 
     my $r = shift; 
     $r->content_type('text/html'); 
     $r->rflush; # send the headers out 

     $r->print(long_operation()); 
     return Apache2::Const::OK; 
    } 
+0

对我来说听起来像OP想要在清理钩子中运行长操作,这将在'handler'返回后调用。所以我不认为刷新输出缓冲区在这种情况下会有所帮助。 – friedo 2010-01-05 18:56:10

+0

嗯,不确定。我将这个问题看作是“在这个长时间运行的任务完成之后,客户端才会看到任何输出。”如果这是真正的问题,那么冲洗应该强制将输出发送到用户的浏览器。另一方面,如果输出已经显示并且只想关闭连接,那么我同意你的看法。我想布莱恩会让我们知道。 – nont 2010-01-05 19:15:36

+0

非常感谢,这是一个很有用的知识。但是,泰迪奥正确地解释了我的涂鸦。我希望它向客户端显示页面已完全加载。换句话说,如果客户关闭浏览器,我不希望这个漫长的过程中止。 – aidan 2010-01-05 23:27:39

相关问题