package My::RouteHandler; use Dancer; use Path::Tiny; use Data::GUID; use Time::Piece; ... post '/some/route' => sub { my %args = params; if ( $args{'long_task'} ) { my $guid = Data::GUID->new->as_string; my $url = '/files/results/' . $guid . '.html'; my $path = config->app_root . '/app/restricted' . $url; my $file = path( $path )->touch; fork and do { $file->spew( sprintf "Results not ready. Please reload this page in a few minutes.
URL: %s
Created: %s", $url, gmtime->datetime ); return redirect $url; }; # now we are off line my $stuff = do_some_lengthy_task(); $file->spew( $stuff ); exit; # because we already forked and returned to the browser } else { ... } }; 1; __END__