On 02/10/2010 10:38 AM, Shao, David (NIH/NLM/NCBI) [C] wrote:
I use CGI::Application for my web app. The app sometimes takes longer to run
than the timeout limit set by the apache server, which results in a 'Bad
Gateway' page at user side. My web admin suggested I need to implement
something similar to 'heartbeat' to keep the connection alive. My
interpretation to this is, while my app is running, it needs to send a
'keepalive' packet to the client in short intervals (i.e. shorter than the
timeout limit), to prevent the server from dropping the connection. I am
fairly new to CGI::Application, and my questions are if this feature already
exists (but I can't find it in documentation), or if it is not, is it
possible to implement using CGI::Application?
The is similar to what the C::A::Plugin::Stream does. Basically you tell
C::A not to send headers and then you print your own response. The
difference being that you don't want to send actual content while your
app is working, but just empty data to hold the connection. Something
like this:
$self-header_type('none');
my $not_done = 0;
while($not_done) {
print \0; # send null byte to keep the connection open
... # do some work
}
If the long running task you want to do can't be broken up into chunks
such that you can print a null byte, then you need to rethink your
architecture. Probably best to think about having a job queue which does
the work and a URL that your page contantly hits to figure out if the
job is done. When it's done you can then redirect the client to where
you want them to go.
--
Michael Peters
Plus Three, LP
# CGI::Application community mailing list
####
## To unsubscribe, or change your message delivery options, ##
## visit: http://www.erlbaum.net/mailman/listinfo/cgiapp##
####
## Web archive: http://www.erlbaum.net/pipermail/cgiapp/ ##
## Wiki: http://cgiapp.erlbaum.net/ ##
####