Continue processing after closing connection [duplicate]

Is there a way in PHP to close the connection (essentially tell a browser than there's no more data to come) but continue processing. The specific circumstance I'm thinking of is that I would want to serve up cached data, then if the cache had expired, I would still serve the cached data for a fast response, close the connection, but continue processing to regenerate and cache new data. Essentially the only purpose is to make a site appear more responsive as there wouldn't be the occasional delay while a user waits for content to be regenerated.

UPDATE:

PLuS has the closest answer to what I was looking for. To clarify for a couple of people I'm looking for something that enables the following steps:

  1. User requests page
  2. Connection opens to server
  3. PHP checks if cache has expired, if still fresh, serve cache and close connection (END HERE). If expired, continue to 4.
  4. Serve expired cache
  5. Close connection so browser knows it's not waiting for more data.
  6. PHP regenerates fresh data and caches it.
  7. PHP shuts down.

UPDATE:

This is important, it must be a purely PHP solution. Installing other software is not an option.


If running under fastcgi you can use the very nifty:

fastcgi_finish_request();

http://php.net/manual/en/function.fastcgi-finish-request.php

More detailed information is available in a duplicate answer.


I finally found a solution (thanks to Google, I just had to keep trying different combinations of search terms). Thanks to the comment from arr1 on this page (it's about two thirds of the way down the page).

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true);
ob_start();
echo 'Text the user will see';
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // All output buffers must be flushed here
flush();        // Force output to client
// Do processing here 
sleep(30);
echo('Text user will never see');

I have yet to actually test this but, in short, you send two headers: one that tells the browser exactly how much data to expect then one to tell the browser to close the connection (which it will only do after receiving the expected amount of content). I haven't tested this yet.


You can do that by setting time limit to unlimited and ignoring connection

<?php
ignore_user_abort(true);
set_time_limit(0);

see also: http://www.php.net/manual/en/features.connection-handling.php


PHP doesn't have such persistence (by default). The only way I can think of is run cron jobs to pre-fill the cache.