Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Continue processing after closing connection [duplicate]

Tags:

php

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.

like image 611
Endophage Avatar asked Jan 26 '11 15:01

Endophage


2 Answers

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.

like image 198
Adam Jimenez Avatar answered Oct 18 '22 05:10

Adam Jimenez


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.

like image 30
Endophage Avatar answered Oct 18 '22 04:10

Endophage