[Catalyst] Capture page on server?

Brian Kirkbride brian.kirkbride at deeperbydesign.com
Mon Jun 23 19:14:30 BST 2008


Martin Ellison wrote:
> I actually want to save a static copy of the front page to improve load 
> times. My fastcgi process sometimes disappears (I'm on shared hosting 
> and I think they auto-cancel stale processes), and it takes a while for 
> the process to be restarted, which impacts the first page load. 
> Subsequent pages are faster but it's the first page that makes the 
> impression on the user. The static plugin does not work, because that 
> requires fastcgi to be running, and my app is too small for me to set up 
> squid.
> 
> So I want to redirect the front page to a static page, but regenerate 
> the static page, and also force the app to do something (so the server 
> can restart the fastcgi process before the user requests any other page).
> 

We do exactly this for our app and it's a lifesaver when hit with a 
Slashdotting.  Our app is 99% read / 1% write so using a lightweight 
HTTP server (Lighttpd, NginX, etc) in front of the FastCGI Catalyst 
app makes for amazing scalability.

To do this, we have something like this in our Root controller:

sub render : ActionClass('RenderView') {}
sub end : Private {
     my ( $self, $c ) = @_;

     $c->forward('render');
     if ($c->stash->{save_response_as}) {
         File::Slurp::write_file(
             $c->stash->{save_response_as},
             { atomic => 1, buf_ref => \$c->res->body }
         );
     }
}

Then you can use some -f style rules in apache or lighttpd to serve 
the file if it exists.  On the (relatively) rare occasion of a write 
request we simple delete the files from the cache.

Hope that helps!
- Brian



More information about the Catalyst mailing list