我使用$r->pool->cleanup_register(\&cleanup);
在处理页面并将其打印到客户端后运行子例程。我希望客户端能够看到完整的页面,并且Apache可以在后台花费几秒钟继续进行一些处理。为什么当我在mod_perl中注册清理处理程序时,浏览器会挂起?
但客户端浏览器挂起,直到清理子文件已返回。有没有办法让我的代码已经返回之前让apache完成与客户端的连接?
我确信我以前做过这件事,但我无法再找到它。
我使用$r->pool->cleanup_register(\&cleanup);
在处理页面并将其打印到客户端后运行子例程。我希望客户端能够看到完整的页面,并且Apache可以在后台花费几秒钟继续进行一些处理。为什么当我在mod_perl中注册清理处理程序时,浏览器会挂起?
但客户端浏览器挂起,直到清理子文件已返回。有没有办法让我的代码已经返回之前让apache完成与客户端的连接?
我确信我以前做过这件事,但我无法再找到它。
使用作业队列系统并完全异步执行长操作 - 只需在Web请求期间安排操作即可。作业队列还可以处理高峰负载情况,而不是在Web服务器进程中进行昂贵的处理。
您想要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;
}
对我来说听起来像OP想要在清理钩子中运行长操作,这将在'handler'返回后调用。所以我不认为刷新输出缓冲区在这种情况下会有所帮助。 – friedo 2010-01-05 18:56:10
嗯,不确定。我将这个问题看作是“在这个长时间运行的任务完成之后,客户端才会看到任何输出。”如果这是真正的问题,那么冲洗应该强制将输出发送到用户的浏览器。另一方面,如果输出已经显示并且只想关闭连接,那么我同意你的看法。我想布莱恩会让我们知道。 – nont 2010-01-05 19:15:36
非常感谢,这是一个很有用的知识。但是,泰迪奥正确地解释了我的涂鸦。我希望它向客户端显示页面已完全加载。换句话说,如果客户关闭浏览器,我不希望这个漫长的过程中止。 – aidan 2010-01-05 23:27:39
++我同意,如果可能的话,完成网络服务器之外的任务。 如果有任何问题(等待锁等),这可能会导致apache实例无法为请求提供服务,并使用Apache的所有内存来执行(可能很简单)的工作。我以前见过这个原因很大...... 如果你不能在你的宿主环境中设置一个cron作业或类似的东西,看看你是否可以fork/exec一个单独的进程来处理这个任务。 – FalseVinylShrub 2010-01-08 05:10:19